Класс с типизированным шрифтом только для чтения не конфликтует с обычным классом машинописного текста, если структура такая же

Я знаю, что машинопись имеет структурный механизм печатания. Я ожидаю, однако, что если у вас есть такой класс:

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>[]

Надеюсь это поможет.

Другие вопросы по тегам