我已經閱讀(再次)了Typescript的文檔來清除關於模塊和命名空間的事情,但我仍然有一些黑點。在Typescript 2.x中創建命名空間
declare namespace Foo{}
namespace Foo{}
export namespace Foo{}
在這些3點的方式來創建一個命名空間,有什麼用途每一個?
比方說,我想創建一個驗證命名空間,我有3個文件有助於該命名空間。這樣做的正確方法是什麼以及我如何從其他文件/模塊導入(使用)Validation命名空間中的代碼?
我已經閱讀(再次)了Typescript的文檔來清除關於模塊和命名空間的事情,但我仍然有一些黑點。在Typescript 2.x中創建命名空間
declare namespace Foo{}
namespace Foo{}
export namespace Foo{}
在這些3點的方式來創建一個命名空間,有什麼用途每一個?
比方說,我想創建一個驗證命名空間,我有3個文件有助於該命名空間。這樣做的正確方法是什麼以及我如何從其他文件/模塊導入(使用)Validation命名空間中的代碼?
這樣做的正確方法是什麼以及我如何去 從另一個文件/模塊導入(使用)驗證命名空間中的代碼?
當你在一個問題中說「導入(使用)」和「文件/模塊」時,你會問兩種截然不同的情況,每種答案都不一樣。
有沒有辦法做到這一點import
和模塊。每個模塊都是獨立的獨立作用域,如果在每個模塊中定義了namespace Validation
,則將創建3個不同的名稱空間,因爲來自不同作用域的聲明不會合並。那麼,你可以通過使用declare global
來突破模塊範圍,但它不符合模塊的規定目的 - 消除全局變量。
您可以使用不是模塊的文件 - 即沒有頂層文件的文件import
或export
。但是,那麼您只能使用非模塊化的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
不起作用。