Структурный подтип потока "забывает" определенные свойства подтипа?
В настоящее время я изучаю структурное типирование. Я скептически отношусь к идее, что два типа считаются эквивалентными только потому, что они имеют общую часть своей структуры. Это похоже на статическую типизацию утки и полностью игнорирует семантический уровень типов. Поэтому я более внимательно посмотрел на структурную типизацию потока обычных объектов и обнаружил следующее поведение:
const o:{} = {foo: true};
o.foo; // type error
{}
это структурный тип и супертип всех обычных объектов. Следовательно, имеет смысл, что я могу комментировать o
с этим, потому что {foo: true}
является структурным подтипом {}
, Тем не менее, когда я пытаюсь получить доступ к существующим foo
свойство, эта операция не проверяет тип. Это странно, потому что AFAIK структурный подтип обычно может содержать определенные свойства, если он также включает в себя все необходимые свойства своего супертипа.
Кажется, что алгоритм структурного подтипа потока иногда забывает свойства, специфичные для определенного подтипа. Это поведение предназначено, или я только столкнулся с крайним случаем?
1 ответ
Общая проблема, которую вы описываете, - это приведение от подтипа к супертипу. Выполняя приведение, вы явно указываете компилятору отказаться от информации о данном объекте.
Например, даже без структурной типизации, если вы делаете
class Animal {}
class Cat extends Animal {
foo: bool = true;
}
const c: Animal = new Cat();
console.log(c.foo);
он не может проверить тип по той же причине. В вашем примере вы явно сказали компилятору o
иметь тип {}
", как и в моем примере, я сказал" рассмотреть c
иметь тип Animal
Msgstr "Из-за этого компилятору явно было сказано забыть, что он работает с Cat
поэтому он забывает, что объект имеет .foo
имущество.
Кажется, что алгоритм структурного подтипа потока иногда забывает свойства, специфичные для определенного подтипа. Это поведение предназначено, или я только столкнулся с крайним случаем?
Поэтому, чтобы ответить на это, он не делает это "время от времени", он делает это именно тогда, когда вы говорите это делать. Поведение абсолютно предназначено.
Это странно, потому что AFAIK структурный подтип обычно может содержать определенные свойства, если он также включает в себя все необходимые свойства своего супертипа.
Объект действительно содержит это свойство, что на 100% нормально, но вы явно стерли эту информацию, приведя значение к супертипу.