【问题标题】:instanceof function parameter returns false in Typescript/Angularinstanceof 函数参数在 Typescript/Angular 中返回 false
【发布时间】:2025-12-01 18:40:01
【问题描述】:

如果对象在我的函数中作为参数传递,我正在尝试找出如何获取对象的类型。

例如你有以下代码

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

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

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

【问题讨论】:

  • typeof 只返回 'object' 而不是对象的类型
  • 动物是如何被创造出来的?你使用 new Cat() 还是 new Bear() ?如果您只有一个与结构匹配的对象 instanceof 将不会返回 true

标签: javascript angular typescript


【解决方案1】:

问题的根源在于这一行

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

对象结构在这里无关紧要。 instanceof 检查对象是否是使用 CatBear 的构造函数创建的,例如new Cat()(实际上,如果两者都扩展 Animal,那么两者的 instanceof Animal 将是 true)。

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

【讨论】:

  • 感谢您的评论。我目前在我的组件中有一个 Cats 数组,并使用 ngFor 在表单中循环它。然后我在表单中使用函数getTypeOfAnimal,猫是从ngFor传入的。所以我认为它并没有真正用 new Cat() 创建......或者在我的模型中定义了构造函数时是否会这样做?
  • 是的,检查cats数组所在的位置。你可以做的是检查猫有而熊没有的属性,这意味着它是Cat。这就是所谓的鸭式打字,它很脏,但它可能适用于小案例
  • 再次感谢您的回答。我现在所做的是检查函数中的一些自定义属性。例如 getTypeOfAnimal(animal) { if(animal.hasOwnProperty('property1'){ return "cat"; } else if (animal.hasOwnProperty('property2') { return "bear"; } } 也许不是我真正的解决方案预期的,但它现在可以工作......
【解决方案2】:

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

如果某些东西对您的需求足够“负担”,则可以解决...

不过,总的来说,请注意不要以这种方式过多地了解类型。主要用例是缩小联合类型。

【讨论】: