type User = {
name: string;
};
const flag: any = false;
let list1: User;
list1 = flag ? flag : 1; // hope error
Почему list1 может быть 1, почему не ошибка: тип «1» не может быть назначен типу «Пользователь»
type User = {
name: string;
};
const flag: any = false;
let list1: User;
list1 = flag ? flag : 1; // hope error
Почему list1 может быть 1, почему не ошибка: тип «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
interface
вместо type/class
, если вы не реализуете какие-либо методы в интерфейсе, который создаете (например, объекты домена только с определениями свойств или POJO в Java). Это делает ваш class/type
более легким
- person Rob Rombouts; 21.05.2019
type
и interface
в данном случае практически одно и то же. class
это другой зверь. Но type
и interface
— это оба типа, которые стираются во время компиляции (они различаются тем, что с ними можно делать в системе типов, но для этого простого примера практической разницы нет)
- person Titian Cernicova-Dragomir; 21.05.2019