2017-01-30 55 views
5

阅读this manual后和这句话的区别:之间有什么`声明namespace`和`声明module`

需要注意的是,在打字稿1.5是很重要的,命名了 改变。 “内部模块”现在是“命名空间”。 “外部模块” 现在只是“模块”

我下的印象是不再使用declare module,由declare namespace取代,然而探索node_modules\@types\node\index.d.ts时,我可以看到,无论declare moduledeclare namespace用于:

declare namespace NodeJS { 
    export var Console: { 
     prototype: Console; 
     new(stdout: WritableStream, stderr?: WritableStream): Console; 
    } 
... 

declare module "buffer" { 
    export var INSPECT_MAX_BYTES: number; 
    var BuffType: typeof Buffer; 
    var SlowBuffType: typeof SlowBuffer; 
    export { BuffType as Buffer, SlowBuffType as SlowBuffer }; 
} 

为什么这么说?有什么不同?

外部模块(ES6模块)不要求在这里发挥作用,据我了解。

+0

对于您在帖子中的链接中的两个段落,都有一个简短的定义。基本上命名空间是Typescripts实现模块模式的方式。虽然模块现在与ES2015模块相同。声明部分意味着两者都预计会出现并由其他人定义。 :) – toskv

+0

@toskv,是的,我肯定读过我链接到的页面。但它很混乱,这就是为什么我在这里发布问题 –

+0

@toskv,我有正确的答案,请参阅[我的答案](http://stackoverflow.com/a/42030656/2545680) –

回答

3

有在TS指定模块的方法有两种:

declare module "buffer" {} // with quotes 

declare module buffer {} // without quotes 

前者(带引号)表示外部模块(ES6模块),目前在.d.ts文件中用于把几个ES6模块放在一个文件中:

declare module "buffer" {} 
declare module "fs" {} 

后者(wi thout报价)作为命名空间,现在与

declare namespace buffer {} 

所以更换,这句话:

需要注意的是在打字稿1.5是很重要的,命名了 改变。 “内部模块”现在是“命名空间”。 “外部模块” 现在是简单的“模块”

“内部模块”是不带引号的模块,因为他们之前1.5使用。

请参阅this issue了解更多详情。

+1

何时使用'declare namespace xxx {}'? – novaline

+0

@novaline,勾选[this](https://www.typescriptlang.org/docs/handbook/namespaces.html)。命名空间本质上是JS中的“Revealing Module Pattern”。你可以询问一个单独的问题以获取更多详细信息,并在此处参考 –

+1

我阅读了官方文档,但文档解释不清楚。我知道'declare module'xxx'{}'的使用。但是仍然不知道何时使用'declare namespace xxx {}','es6 module system'和全局'script'标签有什么关系? – novaline