Pesquisa de site

typescript - Qual é a diferença entre `declare namespace` e `declare module`


Depois de ler este manual e esta citação:

É importante notar que no TypeScript 1.5, a nomenclatura mudou. "Módulos internos" agora são "namespaces". "Módulos externos" agora são simplesmente "módulos".

Eu estava sob a impressão de que declare module não é mais usado e foi substituído por declare namespace, entretanto, ao explorar node_modules\@types\node\index.d.ts eu posso ver que tanto declare module quanto declare namespace são usados:

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 };
}

Por quê? Qual é a diferença?

Módulos externos (módulos ES6) não entram em jogo aqui, pelo que eu entendo.

Resposta #1

Existem duas maneiras de especificar módulos em TS:

declare module "buffer" {} // with quotes

e

declare module buffer {} // without quotes

O primeiro (com aspas) significa módulo externo (módulo ES6) e atualmente é usado em arquivos .d.ts para colocar vários módulos ES6 em um arquivo:

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

O último (sem aspas) foi usado como namespace e agora foi substituído por

declare namespace buffer {}

Então, nesta citação:

É importante notar que no TypeScript 1.5, a nomenclatura mudou. "Módulos internos" agora são "namespaces". "Módulos externos" agora são simplesmente "módulos".

"Módulos internos" são módulos sem aspas, conforme eram usados antes da versão 1.5.

Veja este problema para mais detalhes.

Artigos relacionados