通常,Typescript模块声明为
declare module MyModule {
....
}
但有时我也会看到它像
declare module "MyModule" {
....
}
我想知道将名称作为字符串给出的目的是什么?
这是导入实体为可调用函数的模块的常见模式
我尝试编译MyModule
和"MyModule"
,然后编译成同样的东西。这是否意味着有或没有引号是等价的,并且决定使用它们就像为类名使用大写字母,或者使用I
等启动接口名称一样?
答案 0 :(得分:3)
如Typescript docs所述,两种风格之间存在差异。 module x {
相当于namespace x {
,而module "x" {
与其他两个不同。这绝对令人困惑,这就是为什么文档在所有情况下都使用后一种语法。
那么必须提出一个问题,一个namepsace和一个所谓的外部模块(即一个用引号声明的模块)有什么区别?
我们从文档中获得了一些见解:
就像命名空间一样,模块可以包含代码和声明。主要区别在于模块声明了它们的依赖关系。
模块也依赖于模块加载器(例如CommonJs / Require.js)。
基本上,使用引号表明它确实是传统Javascript意义上的模块,需要使用显式导入。如果没有引号,您只需创建一个可以在没有明确require
的情况下引用和使用的全局对象。
答案 1 :(得分:-1)
"内部模块" ===“名称空间”
“外部模块”===“模块”
关于术语的说明:在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();