2017-01-09 10 views
0

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

и один определенный как это:

class ReadonlyCountry { 
    readonly id: string; 
    readonly name: string;  
} 

, что система типирование бы показать коллизии, если возвращать объект с ReadonlyCountry типом в функции, которая имеет тип возврата Country. Похоже, это не так, как в примере typescript playground, показанном ниже.

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); 
 
}

Так что мой вопрос, как я могу убедиться, что тип, который имеет только для чтения свойства и тип, который не имеет только для чтения типов, и которые являются структурно одни и те же, ошибки шоу типа при смешивании? Я пропустил что-то глупое здесь, и это просто структурная типизация, которая вызывает это?

Любая помощь будет оценена по достоинству.

ответ

0

Да, это структурная типизация, которая вызывает проблемы. Я думаю, вы должны пересмотреть структуру своих классов и попытаться избежать тех, у кого одинаковая структура, с которыми нужно обращаться по-разному.

В качестве примечания стороны. Вместо создания только для чтения версий одних и тех же классов (дублируя таким образом код и введение обслуживания головной боли), почему бы не использовать отображенные типов (see here), и, в частности Readonly один уже предопределены для вас:

function select(value: string): Readonly<Country>[] 

Надежда это помогает.

+0

Я знаю о отображаемом Readonly типе и намерен использовать его. Это, однако, является проблемой для меня. Я использую Redux и хочу, чтобы состояние поступало из моего магазина только для чтения. Это означает, что объект, который выглядит одинаково без реальных свойств (те, которые входят в мой магазин), и вариант с реанимией (тот, который выходит из моего магазина). Я боюсь, что это будет невозможно ... – KwintenP

+0

Я думаю, вам стоит пойти с Readonly, и если хотите - убедитесь, что вы читаете только во время выполнения, также заморозив их сразу же после их получения из магазина (http: //www.2ality .com/2013/08/защита-objects.html). – Amid

+0

Readonly исправляет мою проблему, если я определяю ее везде. Но если кто-то забывает его правильно определить, я бы хотел, чтобы машинописный шрифт подбирал его. Если он этого не сделает (как и в моем примере), я уверен, что разработчики будут где-то там. Я уже использую некоторую замораживающую библиотеку, чтобы иметь проверки времени выполнения, но я хотел бы иметь ее во время компиляции. – KwintenP