使用instanceof时,typescript中不需要强制转换?

使用instanceof时,typescript中不需要强制转换?,typescript,visual-studio-code,Typescript,Visual Studio Code,我正在使用instanceof检查对象是否属于某种类型。 我希望,如果这是真的,我仍然需要将该对象强制转换为该特定类型,然后才能使用它 但是,在IF语句中,似乎不需要强制转换。至少不在VisualStudio代码和中 类饮料{ 价格:数量=4; } 类啤酒饮料{ 酒精:数字=6; } 让数组:数组=新数组(); array.push(新饮料(),新啤酒(),新饮料()); 对于(数组的let g){ //在这里,只有“价格”是饮料的属性 控制台日志(g.price); 如果(啤酒的g实例){ /

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

但是,在IF语句中,似乎不需要强制转换。至少不在VisualStudio代码和中

类饮料{
价格:数量=4;
}
类啤酒饮料{
酒精:数字=6;
}
让数组:数组=新数组();
array.push(新饮料(),新啤酒(),新饮料());
对于(数组的let g){
//在这里,只有“价格”是饮料的属性
控制台日志(g.price);
如果(啤酒的g实例){
//但出乎意料的是,在IF语句中
//酒精值可用!
控制台日志(g.酒精);
//我以为我需要先把饮料换成啤酒:
控制台日志((g)酒精);
}
}
Typescript编辑器的这种行为是非常聪明的还是一个小故障


复制>将上述代码粘贴到中以查看此行为…

这是一个名为类型保护的编译器功能,您可以在的“高级类型”一章中了解更多信息


此外,也没有在Typescript中进行转换这样的事情。您可以做的是在编译时断言值的类型,并覆盖编译器想要分配给它的类型


在本例中,虽然它会自动为您执行此操作。

据我所知,这是自v1.4起提供的:

类型防护装置

JavaScript中的一种常见模式是使用typeof或instanceof 在运行时检查表达式的类型。现在打字 了解这些条件并将更改类型推断 因此,当在if块中使用时


在打字脚本中根本就没有铸造这种东西。您可以在编译时断言某个值属于某个类型,但由于part的实例已经这样做了,因此编译器足够聪明,可以为您断言它。;)这回答了你的问题吗?不,但下面的答案是:)if(g instanceof Beer)已经断言了类型,因此不需要在
if
语句中再次强制转换/断言它。
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);  
    }
}