为什么一些Typescript模块名称以字符串形式给出?

时间:2016-09-18 17:31:47

标签: typescript syntax module typescript-typings

通常,Typescript模块声明为

declare module MyModule {
     ....
}

但有时我也会看到它像

declare module "MyModule" {
     ....
}

我想知道将名称作为字符串给出的目的是什么?

我查看了Typescript docs and found

  

这是导入实体为可调用函数的模块的常见模式

我尝试编译MyModule"MyModule",然后编译成同样的东西。这是否意味着有或没有引号是等价的,并且决定使用它们就像为类名使用大写字母,或者使用I等启动接口名称一样?

2 个答案:

答案 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();

参考链接:

namespaces-and-modules namespaces modules