JavaScript 继承通过从超类构造函数创建原型来工作。
这意味着如果你有这样的东西:
class A { }
class B extends A { }
class C extends B { }
然后您可以使用.prototype 来检查子类:
console.log(A.prototype instanceof Object);
console.log(B.prototype instanceof Object);
console.log(B.prototype instanceof A);
console.log(C.prototype instanceof A);
console.log(C.prototype instanceof B);
console.log(C.prototype instanceof C); // false
这些都记录了true,除了最后一个。
基于此,您可以构建此函数来检查一个类是子类还是与另一个类相同:
declare type Class = new (...args: any[]) => any;
function isSubClassOf(cls: Class, superCls: Class): boolean {
return cls === superCls || cls.prototype instanceof superCls;
}
这些都记录了true,除了最后一个:
console.log(isSubClassOf(C, A));
console.log(isSubClassOf(C, B));
console.log(isSubClassOf(C, C));
console.log(isSubClassOf(B, A));
console.log(isSubClassOf(A, A));
console.log(isSubClassOf(A, C)); // false
在您的情况下,您可以像这样使用该功能:
if (list.findIndex((item) => isSubClassOf(element, item)) === -1) {
list.push(element);
}