Typescript 类型脚本类型流分析

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

我发现了一个案例,其中类型脚本、类型保护和流分析的行为出人意料。我不敢称之为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 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
”。如果这是真的,那么第一个赋值将是编译错误,而不是第二个。对不起,这是一个输入错误。。我是说左边