2017-05-04 31 views
1

我已經閱讀(再次)了Typescript的文檔來清除關於模塊和命名空間的事情,但我仍然有一些黑點。在Typescript 2.x中創建命名空間

  1. declare namespace Foo{}
  2. namespace Foo{}
  3. export namespace Foo{}

在這些3點的方式來創建一個命名空間,有什麼用途每一個?

比方說,我想創建一個驗證命名空間,我有3個文件有助於該命名空間。這樣做的正確方法是什麼以及我如何從其他文件/模塊導入(使用)Validation命名空間中的代碼?

回答

2

這樣做的正確方法是什麼以及我如何去 從另一個文件/模塊導入(使用)驗證命名空間中的代碼?

當你在一個問題中說「導入(使用)」和「文件/模塊」時,你會問兩種截然不同的情況,每種答案都不一樣。

有沒有辦法做到這一點import和模塊。每個模塊都是獨立的獨立作用域,如果在每個模塊中定義了namespace Validation,則將創建3個不同的名稱空間,因爲來自不同作用域的聲明不會合並。那麼,你可以通過使用declare global來突破模塊範圍,但它不符合模塊的規定目的 - 消除全局變量。

您可以使用不是模塊的文件 - 即沒有頂層文件的文件importexport。但是,那麼您只能使用非模塊化的JavaScript(或打字稿)。您的namespace Validation將處於全局範圍內,您不能使用import和模塊,並且必須將所有文件一起編譯並連接在一起,生成適合使用<script>標記加載的單個腳本。

又見How do I use namespaces with TypeScript external modules?

至於具體的語法變種

declare namespace Foo {} 

此聲明,存在命名的Foo,在一些外部文件(不包括在當前編譯)規定,允許使用Foo哪些假定包含在{}內聲明的東西(而{}可能只包含聲明,這裏沒有定義)

namespace Foo {} 

這將創建命名空間Foo

export namespace Foo {} 

這也創造了命名空間富,但export可以有不同的含義,這取決於它出現在源文件中(這也取決於該文件是否是一個模塊或沒有,但我不想詳細說明如何在沒有模塊的情況下使用export)。

如果export位於頂層,它會將文件轉換爲模塊,並使Foo可用於在其他模塊中導入和使用(但不擴展)。如果export不在頂層,那麼它又取決於:如果它位於某個導出的名稱空間中,則它定義嵌套名稱空間,可由導入該外​​部名稱空間的模塊訪問。如果它在非導出名稱空間中,我相信export不起作用。

相關問題