如果使用`export as namespace'定义,是否不能扩展打字稿名称空间?

时间:2018-09-28 19:43:51

标签: typescript visual-studio-code typescript-typings

正在处理一个需要我声明现有Javascript库的新模块的项目,但是在创建类型时,我注意到当尝试扩展typescript documentation中规定的名称空间时,它会完全覆盖预定义的名称空间。

我不确定这是打字稿中的非法操作还是VSCode解释类型的问题。

示例:

// file: existing.d.ts
export as namespace A;
export class Foo {}

// file: extensions.d.ts
namespace A {
    export class Bar {}
}

// resulting intellisense output
A.Foo // doesn't exist
A.Bar // exists

但是,如果将名称空间的原始声明更改为namespace A {}格式,则它将按预期工作。

示例:

// file: existing.d.ts
namespace A {
    export class Foo {}
}

// file: extensions.d.ts
namespace A {
    export class Bar {}
}

// resulting intellisense output
A.Foo // exists
A.Bar // exists

我想主要的问题是在Typescript中这是否合法,还是VSCode的问题。

2 个答案:

答案 0 :(得分:0)

我认为区别在于您在namespace A中声明existing.d.ts的方式

在您的第一个示例中,您基本上说“我在namespace A中声明了class Foo并且我已经existing.d.ts

在第二个示例中,您基本上说“我的namespace A中有class Foo并且我有namespace A属于existing.d.ts

export as namespace A;仅声明名称空间。

答案 1 :(得分:0)

在第一个示例中,existing.d.tsUMD module,即,一个外部模块也将自身公开为UMD全局A。无法直接在全球范围内扩展UMD。相反,您应该通过在内部(1)包含顶级ES6导入或导出并且因此是外部模块的文件中写入declare module "module-name" { ... }来扩展基础外部模块,或者(2)虚拟declare module "dummy" { }块在不是外部模块的文件中。通过UMD全局可以看到以这种方式进行的增强。

如果您需要更多帮助以使其正常工作,请在有关原始库的问题(例如其模块名称)以及您要进行的扩展中添加更多信息。