Условный / троичный результат не проверен правильно в машинописи? - PullRequest
2 голосов
/ 21 мая 2019
type User = {
    name: string;
};
const flag: any = false;
let list1: User;
list1 = flag ? flag : 1;   // hope error

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

1 Ответ

2 голосов
/ 21 мая 2019

Вы используете 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
...