2012-11-17 100 views

回答

9

良好的觀察。

這是一種組合技術,可以使整個導入模塊像在封閉模塊中創建的外部模塊一樣工作。這裏是一個簡短的例子:

module MyModule { 
    export class MyClass { 
     doSomething() { 

     } 
    } 
} 

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

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

export關鍵字本身使模塊成爲一個外部模塊。在這種情況下,即使它最初並未在封閉模塊內部定義,也會使封閉模塊的外部模塊成爲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是正確的,它是一個錯誤。奇怪的是,史蒂夫描述了一個真正的用途,現在呢? – parliament