TypeScript中的类类型检查

kninwzqo  于 2022-12-05  发布在  TypeScript
关注(0)|答案(5)|浏览(157)

在ActionScript中,可以在运行时使用is operator

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

是否可以使用TypeScript检测变量(extends或)是否是某个类或接口?
我在语言规范中找不到任何关于它的东西。当使用类/接口时,它应该在那里。

oaxa6hgo

oaxa6hgo1#

4.19.4 instanceof运算符

instanceof运算符要求左操作数的类型为Any、对象类型或类型参数类型,右操作数的类型为Any或“Function”接口类型的子类型。结果始终为Boolean基元类型。
所以你可以用

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也有同样的问题。由于它是一种仍在开发中的语言,我建议你提出一个这样的建议。
另请参阅:

mi7gmzs6

mi7gmzs62#

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

zysjyyx4

zysjyyx43#

您可以使用instanceof运算符来执行此操作。
instanceof运算符测试构造函数的prototype属性是否出现在对象的原型链中的任何位置。
如果你不知道什么是原型和原型链,我强烈建议你去查一下。这里还有一个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

此示例中的原型链为:
动物〉动物原型〉物体原型

ffdz8vbo

ffdz8vbo4#

有两种类型的检查

  • typeof表示 basic 类型,而
  • complex 类型的instanceof

例如,isString检查可以如下执行:

function isString(value) {
    return typeof value === 'string' || value instanceof String;
}
pxq42qpu

pxq42qpu5#

虽然最近已经有了一些好的答案。如果分配的内容swim作为Type存在,但Value设置为undefined,则@Gilad提出的解决方案存在缺陷。更可靠的检查是:

export const isFish= (pet: Fish | Bird): pet is Fish =>
   Object.keys(pet).includes('swim');

此解决方案不依赖于swim的值!

相关问题