正在处理一个需要我声明现有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的问题。
答案 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.ts
是UMD module,即,一个外部模块也将自身公开为UMD全局A
。无法直接在全球范围内扩展UMD。相反,您应该通过在内部(1)包含顶级ES6导入或导出并且因此是外部模块的文件中写入declare module "module-name" { ... }
来扩展基础外部模块,或者(2)虚拟declare module "dummy" { }
块在不是外部模块的文件中。通过UMD全局可以看到以这种方式进行的增强。
如果您需要更多帮助以使其正常工作,请在有关原始库的问题(例如其模块名称)以及您要进行的扩展中添加更多信息。