2016-03-29 19 views
3

循環依存性が原因であると私は思う問題があります。いくつかの広範な研究の後、私は解決策を見つけることができませんでした。この問題に関連しているようです:TypeScriptのTypeError: b is undefined in __extendsですが、それは私を助けませんでした。Angular 2とSystemJSの循環依存性

this plunkerで問題を簡素化できました。

  • A
  • クラスFから継承A
  • クラスBの配列を含むクラスA、、、作成することができ、工場:

    は基本的に3つのクラスがありますAまたはB値によって異なる

T彼は動的であることができる(各Aはパラメータであり、配列でもよい)パラメータリストを扱い、BAの特殊化でファイルを処理することを目的としています。私は工場を削除しようとしたが、唯一ABで、私はまだ同じエラーを取得:

TypeError: b is undefined Error loading http://localhost:3000/app/main.js

ここa.ts

import { F } from './f'; 

export class A { 
    children: A[] 

    constructor(hasChildren: boolean = false) { 
    if (hasChildren) { 
     for (var i = 0 ; i < 10 ; ++i) { 
     let isB = (Math.random() * 2) > 1; 
     this.children.push(F.createObject(isB)) 
     } 
    } 
    } 
} 

b.tsのコードである

import { A } from './a'; 

export class B extends A { 
} 

およびf.ts

import { A } from './a' 
import { B } from './b' 

export class F { 
    static createObject(isB: boolean): A { 
    if (isB) { 
     return new B 
    } else { 
     return new A 
    } 
    } 
} 
+0

エラーメッセージに示された 'B'を含む行ですか? –

+0

javascriptコンソールで実際にクラスの名前が 'toto'と' tata'の場合、エラーメッセージは 'TypeError:bは未定義です http:// localhost:3000/app/main.js'をロードする際のエラー – Sunder

+0

Plunkerリンクは機能しません私。 –

答えて

3

あなたは、円形の依存関係をこのようにすることはできません。あなたは、インターフェイス

Plunker example

tata.ts

import { IToto } from './itoto'; 


export class Tata implements IToto { 
    children: Toto[] 
} 

toto.ts

import { Tata } from './tata'; 
import { IToto } from './itoto'; 

export class Toto implements IToto{ 
    children: Toto[] = []; 

    constructor(hasChildren: boolean = false) { 
    ... 
    } 
} 

itoto.ts

を使用することによって回避することができます
export interface IToto { 
    children: Toto[] 
} 

も参照してくださいCircular dependency injection angular 2

+2

私はそれを得ることができません - itotoはそれ自身を輸入しますか? – itamar

+0

ええ、これは混乱していますが、どちらもそれを取得していません... – Starwave

+0

私はこの投稿に回答を掲載しましたhttp://stackoverflow.com/a/41807260/6903440 –