繁体   English   中英

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

[英]instanceof function parameter returns false in Typescript/Angular

我试图找出如何获取对象的类型(如果将其作为参数传递给我的函数)。

例如,您有以下代码

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

动物可以是猫或熊的实例。 从我的表单传入的动物总是返回false(同样,如果对象的结构似乎与猫或熊之一匹配)。

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

问题的根源是这条线

如果对象的结构似乎与猫或熊之一匹配

对象结构在这里无关紧要。 instanceof检查是否使用的构造函数创建对象CatBear ,如new Cat() (实际上如果同时延长Animal那么instanceof Animaltrue两个)。

通常,TypeScript使用鸭子类型来解析接口是否与对象结构匹配,并且这是类似对象结构可以工作的地方。 但是instanceof是JavaScript(因为是在运行时执行的),因此TypeScript不能再做更多了。 这就是为什么它不起作用的原因。

如果要处理层次结构中的类,则可以使用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));

如果某事物足够“基本”可以满足您的需要,这可以解决...

但是,总的来说,要当心不要过多地了解类型。 主要用例是缩小联合类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM