Странная проверка типов в машинописи - PullRequest
0 голосов
/ 08 октября 2018

Корпус 1

let d: { id: number };
d = { id: 2, name: 'archer' }; // compilation error 

Корпус 2

  let e: { id: number };
  let e1 = { id: 2, name: 'archer' };
  e = e1; // okay

Заключение

Это печатает, что машинопись не проверяет совместимость при назначенииодна переменная к другой, но это происходит при присваивании и объектном литерале переменной.

Кроме того, я запутался в case 2 , поскольку согласно handbook средство проверки типов выполняет проверку типов только на основе формы.

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Тип совместимости - https://www.typescriptlang.org/docs/handbook/type-compatibility.html

Для Случай 2 применяется следующее правило:

Чтобы проверить, можно ли назначить y для x, компиляторпроверяет каждое свойство x, чтобы найти соответствующее совместимое свойство в y.В этом случае у должен быть член с именем name, который является строкой.Это так, поэтому назначение разрешено.

0 голосов
/ 08 октября 2018

По добавленной вами ссылке

... Литералы объектов получают специальную обработку и проходят проверку избыточных свойств при назначении их другим переменным, илипередавая их в качестве аргументов.Если у литерала объекта есть какие-либо свойства, которых нет у «целевого типа», вы получите сообщение об ошибке

Вот почему сбой в случае 1.

...