Tengo una jerarquía de clases, como Parent , Child1 que extiende Parent, Child2 , etc. Parent almacena una serie de elementos secundarios y necesito importar Child1 y Child2 dentro de Parent .
Obviamente, eso conduce a una dependencia circular y se produce al intentar crear Child1 o Child 2 con el siguiente error:
TypeError: Super expression must either be null or a function¿Cuáles son las opciones para resolver eso?
Por ejemplo, considere la siguiente estructura:
padre.js
export default class Parent { itemArray = [] }niño1.js
import Parent from "./parent.js" export default class Child1 extends Parent { }niño2.js
import Parent from "./parent.js" export default class Child2 extends Parent { } itemArray almacena recursivamente Child1 o Child2
Ahora necesito escribir anotar el itemArray para que parent.js se vuelva como a continuación:
padre.js
import Child1 from "./child1" import Child2 from "./child2" export default class Parent { @Types(() => [Child1, Child2]) itemArray = [] }Esta anotación permite asignar la clase correcta a cada elemento de la matriz cuando el objeto final se construye a partir de un objeto simple. Pero esos son los detalles. La pregunta es:
¿Cómo permitir tal estructura para que no frene toda la jerarquía?
La solución es simple y clara de entender. La idea detrás de la solución es importar clases jerárquicas en un módulo diferente.
// internal.js (New Js File) // This module imports and exports // Parent and Child classes will import classes from here. export { Parent } from "./parent.js"; export { Child1 } from "./child1.js"; export { Child2 } from "./child2.js";Y puede importar la clase requerida desde 'internal.js'. Como ejemplo:
// parent.js import { Child1 } from "./internal.js"; import { Child2 } from "./internal.js"; export class Parent { // @Types annotation method here.. itemArray = []; }Producción:
// index.js file to output result import { Parent } from "./internal.js"; import { Child1 } from "./internal.js"; import { Child2 } from "./internal.js"; var child1 = new Child1(); var child2 = new Child2(); var parent = new Parent(); parent.itemArray.push(child1); parent.itemArray.push(child2); console.log(parent.itemArray.length); //it prints '2'