2016-05-06 3 views
1

Я пытаюсь построить библиотеку свободно-API в машинописи и у меня есть 2 классов, в отдельных файлах, которые ссылаются друг на друг следующим образом:Перекрестные ссылки между родителем и ребенком классом

a.ts

import * as b from "./b" 

export abstract class A { 
    static create(n: number) : A { 
     return new b.B(n); 
    } 
} 

b.ts

import * as a from "./a" 

export class B extends a.A { 
    constructor(n: number) { 
     super(); 
    } 
} 

Мое приложение:

app.ts

import * as a from "./a" 

a.A.create(1); 

Я создал Visual Studio код для запуска этого на узле локально, но я получаю сообщение «Не удается прочитать прототип на неопределенное» на этой линии сгенерированных b.js:

d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); 

Есть ли способ решить эту циклическую зависимость инициализации?

** Редактировать **

Единственный способ решения проблемы я нашел поставить B в том же файле, как A (B не должны быть экспортированы в любом случае).

Моя проблема заключается в том, что будут классы C, D, E и т. Д., Что делает A.ts очень долго и трудно поддерживать.

+0

См. Также: http://stackoverflow.com/questions/14156414/cross-referencing-with-extended-classes-in-typescipt – Paleo

+0

Да, видел это, но старый вопрос и ответ были бесполезны. – akarnokd

ответ

0

Решение состоит в том, чтобы вручную указать порядок импорта в app.ts:

import "./b"; // Manually import `b.ts` before `a.ts` 
import * as a from "./a"; 

a.A.create(1); 

Я уверен, если проблема будет решена с будущей версией Node.js, который будет реализовывать синтаксис ES6 из import/export. Возможно, это ограничение механизма наследования классов ES6.

Смежные вопросы