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

34 浏览
0 Comments

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

阅读了这篇手册和这句话后:

需要注意的是,在TypeScript 1.5中,术语已经发生了变化。“内部模块”现在被称为“命名空间”。而“外部模块”则简称为“模块”。

我原以为declare module不再使用,而是被declare namespace所取代,但是当我探索node_modules\@types\node\index.d.ts时,我发现既有declare module也有declare 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
0 Comments

TypeScript中有两种指定模块的方式:

declare module "buffer" {} // 使用引号

declare module buffer {} // 不使用引号

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

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

后者(不使用引号)曾用作命名空间,现在已被替换为

declare namespace buffer {}

因此,在这段引述中:

重要的是要注意,在TypeScript 1.5中,术语已经改变。“内部模块”现在是“命名空间”。“外部模块”现在只是“模块”

“内部模块”是没有引号的模块,它们在1.5之前被使用。

有关更多详细信息,请参见此问题

何时使用declare namespace xxx {}

,查看这里。命名空间本质上是JS中的“揭示模块模式”。您可以提出一个单独的问题,以获取更多详细信息,并在此处引用它。

我阅读了官方文档,但文档解释得不够清楚。我知道如何使用declare module 'xxx' {}。但仍然不知道何时使用declare namespace xxx {},以及es6模块系统和全局script标签之间的关系是什么?

,没问题,那就提出一个单独的问题。社区比我知道得多。

还有export =export as namespace React。不知道什么时候使用。如果有一些示例来解释这些,我将非常感激!

,抱歉,这些都是与我回答的问题不太相关的问题,提出单独的问题,我会看一下

我认为这个回答没有解答问题。`declare module`和`declare namespace`有什么区别?它们是否做相同的事情?两者都可以使用引号和不使用引号。

0