`declare namespace`和`declare module`有什么区别?

Max*_*kyi 15 typescript

阅读本手册和本引文后:

值得注意的是,在TypeScript 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 };
}
Run Code Online (Sandbox Code Playgroud)

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

根据我的理解,外部模块(ES6模块)不会在这里发挥作用.

Max*_*kyi 6

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

declare module "buffer" {} // with quotes
Run Code Online (Sandbox Code Playgroud)

declare module buffer {} // without quotes
Run Code Online (Sandbox Code Playgroud)

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

declare module "buffer" {}
declare module "fs" {}
Run Code Online (Sandbox Code Playgroud)

后者(没有引号)用作命名空间,现在替换为

declare namespace buffer {}
Run Code Online (Sandbox Code Playgroud)

所以,在这句话中:

值得注意的是,在TypeScript 1.5中,命名法已经改变."内部模块"现在是"命名空间"."外部模块"现在只是"模块"

"内部模块"是没有引号的模块,因为它们在1.5之前使用.

有关其他详细信息,请参阅此问

  • 我不认为这回答了问题。`declare module` 和 `declare namespace` 有什么区别??他们做同样的事情吗?两者都可以带引号和不带引号使用。 (3认同)
  • 何时使用`声明命名空间xxx {}`? (2认同)
  • 我阅读了官方文档,但是文档解释不清楚.我知道使用`declare module'xxx'{}`.但是仍然不知道何时使用`declare namespace xxx {}`,以及`es6 module system`和全局`script`标签的关系是什么? (2认同)