簡體   English   中英

為什么某些 Typescript 模塊名稱以字符串形式給出?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM