импорт дочернего класса внутри родительского класса в javascript

#javascript

Вопрос:

У меня есть иерархия классов, например Parent , Child1 которая расширяет родительский и Child2 т. Д. Parent Хранит массив дочерних элементов, и мне нужно импортировать Child1 и Child2 внутри Parent .

Это, очевидно, приводит к циклической зависимости и выбросам при попытке создать дочерний элемент 1 или Дочерний элемент 2 со следующей ошибкой:

 TypeError: Super expression must either be null or a function  

Каковы варианты решения этой проблемы?

Например, рассмотрим следующую структуру:

parent.js

 export default class Parent {  itemArray = [] }  

child1.js

 import Parent from "./parent.js" export default class Child1 extends Parent { }  

child2.js

 import Parent from "./parent.js" export default class Child2 extends Parent { }  

itemArray рекурсивно сохраняет либо Child1 или Child2

Теперь мне нужно ввести аннотацию к элементу, чтобы parent.js он выглядел как показано ниже:

parent.js

 import Child1 from "./child1" import Child2 from "./child2"  export default class Parent {  @Types(() =gt; [Child1, Child2])  itemArray = [] }  

Эта аннотация позволяет назначить правильный класс каждому элементу в массиве, когда конечный объект строится из простого объекта. Но это уже детали. Вопрос в том,:

Как разрешить такую структуру, чтобы она не тормозила всю иерархию?

Ответ №1:

Решение простое и понятное для понимания. Идея решения заключается в импорте классов, иерархически расположенных в другом модуле.

 // 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";  

И вы можете импортировать необходимый класс из ‘internal.js». В качестве примера:

 // parent.js  import { Child1 } from "./internal.js"; import { Child2 } from "./internal.js";  export class Parent {  // @Types annotation method here..  itemArray = []; }  

Выход:

 // 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'  

Комментарии:

1. Спасибо, это сработало! Не могли бы вы немного объяснить, почему это работает?