TypeScript中的类类型检查

问题描述 投票:208回答:2

在ActionScript中,可以在运行时使用is operator检查类型:

var mySprite:Sprite = new Sprite(); 
trace(mySprite is Sprite); // true 
trace(mySprite is DisplayObject);// true 
trace(mySprite is IEventDispatcher); // true

是否可以使用TypeScript检测变量(扩展或)是否是某个类或接口?

我在语言规范中找不到任何相关信息。使用类/接口时,它应该在那里。

typescript typechecking
2个回答
278
投票

4.19.4 The instanceof operator

instanceof运算符要求左操作数为Any类型,对象类型或类型参数类型,而右操作数为Any类型或“函数”接口类型的子类型。结果始终是布尔基本类型。

所以您可以使用

mySprite instanceof Sprite;

请注意,该运算符也在ActionScript中,但现在不应再在其中使用:

is运算符是ActionScript 3.0的新增功能,它允许您测试变量或表达式是否是给定数据类型的成员。在早期版本的ActionScript中,instanceof运算符提供了此功能,但在ActionScript 3.0中,不应将instanceof运算符用于测试数据类型成员身份。应该使用is运算符而不是instanceof运算符进行手动类型检查,因为表达式x instanceof y只是检查x的原型链是否存在y(在ActionScript 3.0中,原型链无法提供完整的信息。继承层次结构)。

TypeScript的instanceof遇到相同的问题。由于这是一种仍在发展中的语言,因此我建议您陈述有关这种功能的建议。

另请参见:


42
投票

TypeScript具有一种在运行时验证变量类型的方法。您可以添加一个返回type predicate的验证函数。因此,您可以在if语句内调用此函数,并确保该块内的所有代码都可以安全地用作您认为的类型。

来自TypeScript文档的示例:

function isFish(pet: Fish | Bird): pet is Fish {
   return (<Fish>pet).swim !== undefined;
}

// Both calls to 'swim' and 'fly' are now okay.
if (isFish(pet)) {
  pet.swim();
}
else {
  pet.fly();
}

查看更多信息:https://www.typescriptlang.org/docs/handbook/advanced-types.html

© www.soinside.com 2019 - 2024. All rights reserved.