Класс с типизированным шрифтом только для чтения не конфликтует с обычным классом машинописного текста, если структура такая же
Я знаю, что машинопись имеет структурный механизм печатания. Я ожидаю, однако, что если у вас есть такой класс:
class Country {
id: string;
name: string;
}
и один определяется так:
class ReadonlyCountry {
readonly id: string;
readonly name: string;
}
что система печати будет показывать коллизии, если вы вернете объект с ReadonlyCountry
введите функцию, которая имеет тип возвращаемого значения Country
, Похоже, что это не так, как в примере с машинописной игровой площадкой, показанном ниже.
class Country {
id: string;
name: string;
}
class ReadonlyCountry {
readonly id: string;
readonly name: string;
}
function select(value: string): ReadonlyCountry[] {
let country = new Country();
country.id = "1";
country.name = "name";
return [country];
}
function select2(value: string): Country[] {
// the type of the return here will be ReadonlyCountry[]
// the type of the function return here is Country[]
// why doesn't this collide?
return select(value);
}
Итак, мой вопрос: как я могу убедиться, что тип, который имеет свойства только для чтения, и тип, который не имеет типов только для чтения и которые структурно одинаковы, показывают ошибки типов при смешивании? Я что-то упускаю здесь глупо, и это только структурная типизация вызывает это?
Любая помощь будет оценена.
1 ответ
Да, это структурная типизация, которая вызывает ваши проблемы. Я думаю, что вы должны пересмотреть структуру ваших классов и постараться избегать тех, кто имеет одинаковую структуру, к которой нужно относиться по-разному
Как примечание стороны. Вместо того, чтобы создавать версии тех же классов только для чтения (таким образом, дублируя ваш код и создавая головную боль при обслуживании), почему бы не использовать сопоставленные типы ( см. Здесь), и особенно Readonly
один уже предопределен для вас:
function select(value: string): Readonly<Country>[]
Надеюсь это поможет.