Условный/троичный результат не проверяется правильно в машинописном тексте?

type User = {
    name: string;
};
const flag: any = false;
let list1: User;
list1 = flag ? flag : 1;   // hope error

Почему list1 может быть 1, почему не ошибка: тип «1» не может быть назначен типу «Пользователь»


person color_cat    schedule 21.05.2019    source источник


Ответы (1)


Вы используете any в аннотации к flag. any по определению присваивается любому типу и присваивается из любого типа. Это означает, что результатом выражения flag ? flag : 1 будет any (поскольку один из результатов троичного выражения — any, тип выражения — any | 1, который будет уменьшен до any).

Вообще избегайте any. Если вы действительно не знаете тип во время компиляции, используйте unknown. В этом случае удаление аннотации приводит к ошибке, как и ожидалось:

type User = {
    name: string;
};
const flag = false; // no annotation 
let list1: User;
list1 = flag ? flag : 1; // err
person Titian Cernicova-Dragomir    schedule 21.05.2019
comment
также общее замечание: лучше использовать interface вместо type/class, если вы не реализуете какие-либо методы в интерфейсе, который создаете (например, объекты домена только с определениями свойств или POJO в Java). Это делает ваш class/type более легким - person Rob Rombouts; 21.05.2019
comment
@RobRombouts type и interface в данном случае практически одно и то же. class это другой зверь. Но type и interface — это оба типа, которые стираются во время компиляции (они различаются тем, что с ними можно делать в системе типов, но для этого простого примера практической разницы нет) - person Titian Cernicova-Dragomir; 21.05.2019
comment
спасибо, что прояснили это для меня, преимущество интерфейса перед типом в том, что интерфейс можно расширить, тип косяк, запутался с этим. Я всегда использую интерфейс по этой причине. - person Rob Rombouts; 21.05.2019
comment
Типы @RobRombouts можно использовать в качестве базового типа для интерфейса. Они не могут сами расширять другие интерфейсы (хотя пересечения моделируют это достаточно хорошо). Типы не могут участвовать в слиянии, поэтому путь расширения закрыт. Любой из них будет работать для простых случаев, хотя я обычно тоже предпочитаю интерфейсы :) - person Titian Cernicova-Dragomir; 21.05.2019