instanceof函数参数在Typescript / Angular中返回false

时间:2017-12-04 08:50:48

标签: javascript angular typescript

如果它在我的函数中作为参数传递,我试图找出如何获取Object的类型。

例如,您有以下代码

getTypeOfAnimal(animal){
   console.log(animal instanceof Cat)
   console.log(animal instanceof Bear)
}

动物可以是猫或熊的一个实例。从我的表单传入的动物总是返回false(如果Object的结构似乎与Cat或Bear中的一个匹配)。

有没有办法正确获取类型?

2 个答案:

答案 0 :(得分:4)

问题的根源是这一行

  

如果对象的结构似乎与Cat或Bear中的一个匹配

对象结构在这里不重要。 instanceof检查对象是否是使用CatBear的构造函数创建的,例如new Cat()(实际上,如果两者都延伸Animal,那么instanceof Animaltrue为{}}。

通常,TypeScript使用duck typing来解析接口是否与对象结构匹配,这是类似对象结构可以工作的地方。但是instanceof是JavaScript(因为它是在运行时执行的),因此没有更多的TypeScript可以做到。这就是为什么它不像你预期的那样有效。

答案 1 :(得分:0)

如果您正在处理层次结构中的类,则可以使用instanceof

class Animal {
    name: string;
}

class Cat extends Animal {
    purrs: boolean;
}

class Bear extends Animal {
    growls: boolean;
}


const animal = new Cat();
console.log(animal instanceof Cat); // true
console.log(animal instanceof Bear); // false

在处理要缩小的结构类型时,可以使用自定义类型保护:

const structuralBear = {
    name: 'Paddington',
    growls: false
};

console.log(structuralBear instanceof Cat); // false
console.log(structuralBear instanceof Bear); // false

function isBeary(obj: any): obj is Bear {
    console.log(typeof obj.growls);
    return (typeof obj.name === 'string' && typeof obj.growls === 'boolean');
}

console.log(isBeary(structuralBear));

如果某事是" beary"足以满足您的需求...

但总的来说,要注意需要以这种方式了解类型。主要用例是缩小联合类型。