Typescript 类型脚本类型流分析
我发现了一个案例,其中类型脚本、类型保护和流分析的行为出人意料。我不敢称之为bug,我真的不知道它应该如何工作。根据我的经验,通常它只是神奇地实现了我想要的Typescript 类型脚本类型流分析,typescript,types,Typescript,Types,我发现了一个案例,其中类型脚本、类型保护和流分析的行为出人意料。我不敢称之为bug,我真的不知道它应该如何工作。根据我的经验,通常它只是神奇地实现了我想要的 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
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
}
你可以在网上试试。报告的编译错误对我来说没有意义
类型“Parent”上不存在属性“other”
我假设在
if
块中,x
被键入为Child
。为什么会这样?是否有一个合适的解决方法?在您的第一个x=x.other
右侧x
被视为子项
。这是正确的,因为它位于if(Child的x instanceof){…}
左侧的
x
被认为是Parent
,我们可以说它也是右侧的,因为您声明了let x:Parent
这种矛盾可能有点问题,但另一方面,您可以责怪自己,因为您试图通过冲突声明以任何方式混淆编译器…:)
所以在你的第二个
x=x.other
右侧x
被视为Parent
(作为前一行的左侧x
),因此您得到的属性“other”在类型“Parent”上不存在。
在第一个x=x.other
右侧x
被视为子项
。这是正确的,因为它位于if(Child的x instanceof){…}
左侧的
x
被认为是Parent
,我们可以说它也是右侧的,因为您声明了let x:Parent
这种矛盾可能有点问题,但另一方面,您可以责怪自己,因为您试图通过冲突声明以任何方式混淆编译器…:)
所以在你的第二个
x=x.other
右侧x
被视为Parent
(作为前一行的左侧x
),因此您得到的属性“other”在类型“Parent”上不存在。
您说“右侧x
被视为Parent
”。如果这是真的,那么第一个赋值将是编译错误,而不是第二个。对不起,这是一个输入错误。。我的意思是左边你说的“右边x
被认为是Parent
”。如果这是真的,那么第一个赋值将是编译错误,而不是第二个。对不起,这是一个输入错误。。我是说左边