user_of_toster
@user_of_toster

В чем логика не проверять типы по переменной?

Читаю доки тайпскрипта:
https://www.typescriptlang.org/docs/handbook/inter...

Если передать объект с неправильными типами напрямую, получается ошибка:
let mySquare = createSquare({colour: "red", width: 100}); // Argument of type '{ colour: string; width: number; }' is not assignable...

А если передать тот же объект через переменную, то ошибки нет:
let squareOptions = { colour: "red", width: 100 };
let mySquare = createSquare(squareOptions);


Вопрос - в чем прикол и зачем было так делать? Почему типы не проверяются через переменные?
  • Вопрос задан
  • 72 просмотра
Решения вопроса 1
bingo347
@bingo347
Ткнуть в доку лучше готового к копипасте ответа
В TypeScript структурная типизация, а это значит, что типы идентичные по структуре являются одним и тем же типом. Например типы { colour: string; width: number; } и { colour: string; } & { width: number; } являются одним и тем же типом.
Помимо того в TypeScript присутствует иерархия типов, то есть существуют отношения между типами, когда один тип является подтипом другого. Например тип { colour: string; width: number; } является подтипом { width: number; }. Значение подтипа можно беспроблемно присвоить в переменную родительского типа. Значение типа { colour: string; width: number; } содержит все поля требуемые типом { width: number; }, а значит присваивание первого во второго гарантировано не приведет к ошибке, но результирующий код получит доступ только к части данных. Это поведение вполне удовлетворяет примеру
let squareOptions = { colour: "red", width: 100 };
let mySquare = createSquare(squareOptions);

Однако, когда мы присваиваем литерал, иерархия типов учитывается меньше, так как подтип ограничит нас в получении данных в дальнейшем, а других способов получить эти данные нет. По этому TypeScript и ругается на передачу литерала тутcreateSquare({colour: "red", width: 100});Поле colour будет просто утеряно, так как тип { width: number; } не даст к нему доступ.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
yarkov
@yarkov
Проект "Жизнь после смерти" - lifeafterdeath.ru
А теперь сделай свойство color обязательным ))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы