打字稿类型流程分析

时间:2016-12-12 19:42:24

标签: typescript types

我发现了一个打字机类型防护和流量分析出乎意料的情况。我毫不犹豫地把它称为​​一个错误,我真的不知道它应该如何工作。根据我的经验,通常它只是神奇地做我想要的。

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。为什么会这样?有没有一个像样的解决方法?

1 个答案:

答案 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'. }