2016-10-04 31 views
1

ParentChildの2つのクラスを作成したいと思います。これらのクラスには、それぞれ別のタイプのインスタンスへの参照が含まれています。多くのコンパイル言語では、これは完全に合法です。たとえば、C#では次のようにコンパイルされます。Typescript - 相互参照するクラスは使用できますか?

public class Parent { 
    public Child myChild; 

    public Parent() { 
     myChild = new Child(); 
     myChild.myParent = this; 
    } 
} 

public class Child { 
    public Parent myParent; 
} 

ただし、TypeScriptではこれを動作させることはできません。私が見つけた最良の選択肢は、anyタイプの参照のうちの1つを作成することですが、ChildParentまたは他のメンバーのいずれかで作業する必要がある静的型検査を無効にします。理想的な世界では

class Parent { 
    myChild: Child; 

    constructor() { 
     this.myChild = new Child(); 
     this.myChild.myParent = this; 
    } 
} 

class Child { 
    myParent: any; 
} 

、すべてのオブジェクトモデルは、非環式グラフで簡単に記述可能になるが、現実の世界は乱雑で、時には両方の方法、グラフオブジェクトをナビゲートできるようにするには非常に便利です。

TypeScriptでは、このような双方向の静的型オブジェクトグラフナビゲーションを取得できますか?どうやって?

+0

[活字体で循環型参照]の可能性のある重複します(http://のstackoverflow。 com/questions/24444436/circular-type-references-typescript) – JamesFaix

+0

私のために働いています - あなたはどんなエラーを受けていますか? –

答えて

0

両方のクラスが同じファイル(モジュール)にある場合、問題はありません。たとえば、次のコードは正常に動作します:

class Parent 
{ 
    public myChild: Child; 

    public constructor() 
    { 
     this.myChild = new Child(); 
     this.myChild.myParent = this; 
    } 

    public callMe() 
    { 
     this.myChild.callMe(); 
    } 

    public callMeAgain() 
    { 
     console.log("Parent"); 
    } 
} 

class Child 
{ 
    public myParent: Parent; 

    public callMe() 
    { 
     console.log("Child"); 
     this.myParent.callMeAgain(); 
    } 
} 

let p = new Parent(); 
p.callMe(); 

playground

UPDATE。

残念ながら、最新のtypescript 2.0.3のモジュール間の相互参照は一般的には機能しません。もう少し複雑な相互参照の場合(これはexampleとしてください)はまだ動作しません。あなたが前のリンクを参照することができ、これanswer

+0

このソリューションは技術的には機能しますが、すべてを1つのファイルにまとめることは非常にスケーラブルなソリューションではありません。 – JamesFaix

+0

私は同じファイルに入っていればうまくいくが、ファイルが違うのはなぜですか? –

+0

私の更新された回答を参照 – Amid

0

このコードはTypeScript 2.0.2を使用して、私のために正しくビルドする理由について:

class Parent { 
    myChild: Child; 

    constructor() { 
     this.myChild = new Child(); 
     this.myChild.myParent = this; 
    } 
} 

class Child { 
    myParent: Parent; 
} 
+0

あなたの要点は別々のファイルにする必要がありますか? –

+0

いいえ、必要はありません。 OPは、同じファイルに入っていたので、別の答えを無視してコメントを出しました。 –

+0

OPのコードに何か問題がありますか? –

関連する問題