使用instanceof时,在打字稿中不需要强制转换?

时间:2017-05-23 14:50:41

标签: typescript visual-studio-code

我正在使用instanceof来检查对象是否属于某种类型。 我希望如果这是真的,我仍然需要将该对象强制转换为该类型,然后才能使用它。

但相反,在IF声明中,似乎没有必要进行演员表演。至少不在Visual Studio代码和Typescript Playground

class Drink { 
    price: number = 4;
}

class Beer extends Drink { 
    alcohol: number = 6;
}

let array: Array<Drink> = new Array<Drink>();
array.push(new Drink(), new Beer(), new Drink());

for (let g of array) { 
    // here, only 'price' is available as a property of drink
    console.log(g.price);
    if (g instanceof Beer) {    
        // but unexpectedly, inside the IF statement
        // the alcohol value IS available!
        console.log(g.alcohol);

        // I expected I needed to cast drink to beer first:
        console.log((<Beer>g).alcohol);  
    }
}

这是一个非常聪明的Typescript编辑器行为还是这个故障?

复制&gt;将以上代码粘贴到Typescript Playground中以查看此行为...

2 个答案:

答案 0 :(得分:4)

据我记得,这是Type Guards,自v1.4起可用:

  

类型护卫

     

JavaScript中的常见模式是使用typeof或instanceof   在运行时检查表达式的类型。现在输入TypeScript   了解这些条件并将改变类型推断   相应地,当在if块中使用时。

答案 1 :(得分:2)

这是一个名为类型防护的编译器功能,您可以在handbook的高级类型章节中阅读更多相关内容。

也没有在Typescript中进行投射的事情。你可以做的是在编译时断言值的类型并覆盖编译器想要分配给它的类型。

在这种情况下,虽然它会自动为您完成。