我目前正在研究结构类型。我怀疑两种类型被认为是等价的,因为它们碰巧有一部分结构是相同的。这感觉很像静态鸭子类型,它完全忽略了类型的语义级别。于是仔细看了一下flow对普通对象的结构类型化,遇到了如下行为:
const o:{} = {foo: true};
o.foo; // type error
{}
是结构类型,是所有普通对象的超类型。o
因此,我可以用它进行注释是有道理的,因为它{foo: true}
是{}
. 但是,当我尝试访问现有foo
属性时,此操作不会键入检查。这很奇怪,因为 AFAIK 结构子类型通常可以包含特定属性,只要它还包括其超类型的所有必需属性。
似乎流的结构子类型算法偶尔会忘记特定于某个子类型的属性。这种行为是有意的还是我只是遇到了边缘情况?