我发现了一个打字机类型防护和流量分析出乎意料的情况。我毫不犹豫地把它称为一个错误,我真的不知道它应该如何工作。根据我的经验,通常它只是神奇地做我想要的。
class Parent { }
class Child extends Parent {
other: Child;
}
let x: Parent = null;
if (x instanceof Child) {
x = x.other;
x = x.other; // this line gives a compilation error
}
您可以在Typescript Playground上尝试一下。报告的编译错误对我没有意义。
财产'其他'在类型' Parent'。
上不存在
我认为在if
块内,x
被输入为Child
。为什么会这样?有没有一个像样的解决方法?
答案 0 :(得分:0)
在您认为x = x.other;
的右侧x
的第一个Child
中。它是对的,因为它保持在if (x instanceof Child){...}
之内
左侧x
被视为Parent
,我们可以说它也是正确的,因为您声明了let x: Parent
。
这个矛盾可能有些小问题,但另一方面你可以责备自己,因为你试图通过相互冲突的声明来混淆编译器...... :)
因此,在您的第二个x = x.other;
上,右侧x
被视为Parent
(作为前一行的左侧x
),因此您获得Property 'other' does not exist on type 'Parent'.
}