[英]Why are some Typescript module names given as strings?
通常,Typescript 模塊聲明如下
declare module MyModule {
....
}
但有時我也看到它
declare module "MyModule" {
....
}
我想知道將名稱作為字符串的目的是什么?
我檢查了Typescript 文檔並發現
這是導入實體是可調用函數的模塊的常見模式
我嘗試編譯MyModule
和"MyModule"
,它們編譯成同樣的東西。 這是否意味着帶或不帶引號是等效的,決定使用它們就像使用大寫字母作為類名,或以I
開頭接口名稱等?
正如Typescript 文檔中所述,這兩種樣式之間存在差異。 module x {
等價於namespace x {
,而module "x" {
與其他兩個不同。 這絕對令人困惑,這就是文檔在所有情況下都使用后一種語法的原因。
那么必須問的問題是,命名空間和所謂的外部模塊(即用引號聲明的模塊)之間有什么區別?
我們從文檔中得到了一些見解:
就像命名空間一樣,模塊可以包含代碼和聲明。 主要區別在於模塊聲明了它們的依賴關系。
模塊還依賴於模塊加載器(例如 CommonJs/Require.js)。
本質上,使用引號表明它確實是傳統 Javascript 意義上的模塊,需要使用顯式導入。 沒有引號,您只需創建一個全局對象,無需任何明確的require
即可引用和使用該對象。
“內部模塊” === “命名空間”
“外部模塊” === “模塊”
關於術語的說明:請務必注意,在 TypeScript 1.5 中,術語已更改。 “內部模塊”現在是“命名空間”。 “外部模塊”現在只是“模塊”,與 ECMAScript 2015 的術語保持一致(即模塊 X { 相當於現在首選的命名空間 X {)。
/*
Note: All of these files in the same folder, i.e. the same path!
*/
// declare a namespace, demoNamespace.d.ts
declare namespace "DemoNamespace" {
export function fn(): string;
}
// using a namespace, demoNamespaceModule.ts
import * as n from "demoNamespace";
//let f = new n.DemoNamespace.fn(); ???
// export a module, demoModule.ts
export class Alpha { /* ... */ }
export class Beta { /* ... */ }
// using a module, demoModuleTest.ts
import * as m from "./demoModule";
let a = new m.Alpha();
let b = new m.Beta();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.