Tengo una matriz de clases (no objetos). Solo necesito agregar nuevas clases a la matriz solo si no hay una subclase. Pero este código no funciona, estos no son objetos iniciados.
import {A} from './a'; import {B} from './b'; import {otherList} from './list'; export const getList =()=>{ const list = [A,B]; otherList.forEach((element) => { if (list.findIndex((item) => element instanceof item) === -1) { list.push(element); } }); return list; }La herencia de JavaScript funciona al crear el prototipo a partir del constructor de la superclase.
Esto significa que si tienes algo como esto:
class A { } class B extends A { } class C extends B { } entonces puede buscar una subclase con .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 Todos estos registros son true excepto el último.
En base a eso, puede crear esta función para verificar si una clase es una subclase o la misma clase que la otra:
declare type Class = new (...args: any[]) => any; function isSubClassOf(cls: Class, superCls: Class): boolean { return cls === superCls || cls.prototype instanceof superCls; } Todos estos registros son true excepto el último:
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)); // falseEn su caso, puede usar la función de esta manera:
if (list.findIndex((item) => isSubClassOf(element, item)) === -1) { list.push(element); }