361

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

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

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

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

4

3 回答 3

474

4.19.4 instanceof 运算符

运算符要求左操作数为 Any 类型、instanceof对象类型或类型参数类型,右操作数为 Any 类型或“Function”接口类型的子类型。结果总是布尔原始类型。

所以你可以使用

mySprite instanceof Sprite;

请注意,此运算符也在 ActionScript 中,但不应再在那里使用:

is 运算符是 ActionScript 3.0 的新功能,允许您测试变量或表达式是否是给定数据类型的成员。在先前版本的 ActionScript 中,instanceof 运算符提供了此功能,但在 ActionScript 3.0 中,instanceof 运算符不应用于测试数据类型成员资格。应该使用 is 运算符而不是 instanceof 运算符进行手动类型检查,因为表达式 x instanceof y 仅检查 x 的原型链是否存在 y(在 ActionScript 3.0 中,原型链不提供继承层次结构)。

TypeScriptinstanceof也有同样的问题。由于它是一种仍在开发中的语言,我建议您提出这种设施的建议。

也可以看看:

于 2012-10-08T20:54:10.410 回答
89

TypeScript 有一种在运行时验证变量类型的方法。您可以添加一个返回类型谓词的验证函数。因此,您可以在 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

于 2016-11-21T10:42:39.203 回答
21

您可以instanceof为此使用运算符。来自 MDN:

instanceof 运算符测试构造函数的原型属性是否出现在对象的原型链中的任何位置。

如果您不知道原型和原型链是什么,我强烈建议您查找。这里还有一个 JS(TS 在这方面的工作方式类似)示例,它可能会阐明这个概念:

    class Animal {
        name;
    
        constructor(name) {
            this.name = name;
        }
    }
    
    const animal = new Animal('fluffy');
    
    // true because Animal in on the prototype chain of animal
    console.log(animal instanceof Animal); // true
    // Proof that Animal is on the prototype chain
    console.log(Object.getPrototypeOf(animal) === Animal.prototype); // true
    
    // true because Object in on the prototype chain of animal
    console.log(animal instanceof Object); 
    // Proof that Object is on the prototype chain
    console.log(Object.getPrototypeOf(Animal.prototype) === Object.prototype); // true
    
    console.log(animal instanceof Function); // false, Function not on prototype chain
    
    

本例中的原型链为:

动物 > Animal.prototype > Object.prototype

于 2020-04-20T08:47:06.273 回答