2012-11-17 15 views

答えて

9

良好な観察。

これは、インポートされたモジュール全体を、囲みモジュール内で作成された外部モジュールのように動作させるコンポジション手法です。短縮された例を以下に示します。

module MyModule { 
    export class MyClass { 
     doSomething() { 

     } 
    } 
} 

declare module EnclosingModule { 
    export import x = module(MyModule); 
} 

var y = new EnclosingModule.x.MyClass(); 

エクスポートキーワードは、モジュールを外部モジュールにします。この場合、内包モジュールの内部モジュールが最初に定義されていないにもかかわらず、内包モジュールの外部モジュールをMyModuleにしています。

なぜですか?

これは、異なるコンテキストで繰り返すのではなく、モジュールを再利用する便利な方法だと思います。論理的に見える複数の場所でモジュールにアクセスできるようになります。

+0

優秀、ありがとう! –

+1

仕様の9.2.2節で「インポート宣言で宣言されたモジュール識別子をエクスポートすることはできません」ということは興味深いです。私の用語が間違っていない限り、私たちは上記のことをしていないのですか? – Crwth

+1

このようにボックスの外では機能しませんが、定義で使用できます。モジュール宣言SomeModule {export import stuff = module( "stuff"); } ' – Fenton

4

0.8.1.1から、他のモジュールで宣言されたクラスを拡張するクラスをエクスポートするときは、この構文を使用する必要があるようです。例えば

は、0.8.1で、あなたがこれを言うことができます:

import mUiBase = module("../UiBase"); 

export class BaseViewModel extends mUiBase.UiBase { 
} 

しかし、0.8.1.1で、それはあなたにエラーを与える「エクスポートクラスは、プライベートモジュールからクラスを拡張する」ので、あなたは何をする必要がありますこれは代わりに

export import mUiBase = module("../UiBase"); 

export class BaseViewModel extends mUiBase.UiBase { 
} 

おそらくそれは意図されたものであり、単なるバグではありません。

+1

CodePlexについての議論から私は理解していますが(現時点ではリンクが見つかりません...)、これはバグであり、エクスポートのインポートは一時的な回避策です。 – JcFx

+0

私は0.8.1.1を使っていました...ちょうど0.8.3にアップグレードされ、私の "輸出輸入"はすべてエラーになりました(単に輸出を取り除くことができます)。だから、JcFxはそれがバグであるということに関しては正しかった。 Steveがこれに本当の使い方を説明したことは不思議で、それではどうですか? – parliament