使用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);
}
}