4

私は非常に大きなプロジェクトで--module system(SystemJS)でTypeScriptを使用しています。 SystemJSは周期的な依存関係をサポートしており、ほとんどの場合、正常に動作します。しかし、TypeScriptの継承が関与すると、事態が壊れるようになります。 class Aが最初にロードされる場合SystemJSのTypeScript継承と循環依存関係

class Aclass Bに依存している場合たとえば

、およびclass Bはその後、class Aから継承:

  1. それはclass A's解像度を一時停止し、class B依存関係をロードしようとする
  2. class Bは、class Aにアクセスしたため、依存関係が解決されたとみなされます。 class Aはまだ定義されていないため、継承は解決されません。
  3. class B's

「ソリューション」のほとんどは、私がされているいずれかのモジュールローダとの循環依存関係にウェブ上で見つけることができます。

    は/あなたのデザインを変更し、単一のモジュール
  • CommonJSと非にクラスを組み合わせ
  • TypeScript固有の回避策

循環型設計の正当な理由があるようで、クラスを巨大ファイルに結合することは必ずしも望ましくないので、これらの回避策をb私が求めている質問の話題から離れている。

実際の問題に対する解決策はありますか?

答えて

6

デザインを変更することが最も適しています。クラスはそのサブクラスに依存すべきではありません。あなたが工場などでそれらを使用する場合、それは別個の懸念事項であり、別のクラス/機能/モジュールに入るべきです。

実際の問題を解決するソリューションはありますか?

あなたが言ったように、問題は、モジュールAが最初にロードされたときにのみ発生します。解決策は、それを防止し、Aとそのサブクラスに対するプロキシとして機能する追加のモジュールを記述し、正しい順序でそれらをインポートすることです。

0

この場合、別のインターフェイスIを作成して、A -> Bの依存関係を削除することをお勧めします。 ABは両方ともIを知る必要があり、Bはそれを実装する必要があります。 (Bで実装)Iのコンストラクタや工場を見つけるためにAを伝える必要がありますBロード・プロセス中

。これは、これらの依存関係を持つあなたを残します:

import I from "./i"; 

class A { 
    private static __ICtor : new() => I; 
    public static setIConstructor(ctor: new() => I) { 
    A.__ICtor = ctor; 
    } 

    private __atSomePoint() : I { 
    return new A.__ICtor(); 
    } 
} 

export default A; 

そして最後にclass B

import I from "./i"; 
import A from "./a"; 

class B extends A implements I { 
    public bFoo() {} 
} 

A.setIConstructor(B); 

interface I { 
    bFoo(): void; 
} 

export default I; 

Class Aは次のようになります。

A -> I 
B -> I 
B -> A 

インタフェースIはこのようになります。

IMHOこれは今でも遅すぎる場合でも循環依存を解決します。

0

ここにプラグイン変換バベルを使用してこの問題を解決するためにきちんとした方法があります:それは何https://github.com/zertosh/babel-plugin-transform-inline-imports-commonjs

はそれがインラインにAT-START-OF-ファイルモジュールの輸入を変換していることだけで、実際に必要と/インポートすることが必要です他のモジュールは使用される直前にインストールされます。

ほとんどの場合、これはクラス使用コードが実際に実行されるときにモジュールがすべてエクスポートを完了したときに自動的に問題を解決します。


上記のプラグインは、プロジェクト内のすべてのインポートに適用され、すべてインラインで実行されることに注意してください。しかし、より深刻な問題は、相対パスのインポート/要求が機能するように組み込みの方法を見つけることができなかったことです。

私はここでプロジェクトの私のフォークの両方でこれらの問題を修正:https://github.com/Venryx/babel-plugin-transform-inline-imports-commonjs

私は、これらの変更のためのプル要求を行ったが、それはレビューの気圧を待っています。

関連する問題