【问题标题】:Is extending a typescript namespace not allowed if defined with `export as namespace`?如果使用“导出为命名空间”定义,是否不允许扩展打字稿命名空间?
【发布时间】:2019-03-04 19:59:27
【问题描述】:

在一个需要我声明现有 Javascript 库的新模块的项目上工作,但是在创建类型时,我注意到当尝试按照 typescript documentation 中的指示扩展命名空间时,它完全覆盖了 pre-定义的命名空间。

我不确定这是打字稿中的非法操作还是 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 的问题。

【问题讨论】:

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


    【解决方案1】:

    在第一个例子中,existing.d.ts 是一个UMD module,即一个外部模块,它也将自己暴露为一个 UMD 全局 A。无法直接增加 UMD 全局。相反,您应该通过在 (1) 包含顶级 ES6 导入或导出的文件中写入 declare module "module-name" { ... } 来扩充底层外部模块,因此是一个外部模块,或者 (2) 在文件中的虚拟 declare module "dummy" { } 块不是外部模块。以这种方式进行的增强将通过 UMD 全局可见。

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

    【讨论】:

      【解决方案2】:

      我认为不同之处在于您在 existing.d.ts 中声明 namespace A 的方式 .

      对于你的第一个例子,你基本上说“我有namespace A,我有class Foo在我的existing.d.ts中声明”

      对于第二个示例,您实际上是在说“我有 namespace A 并且我的 existing.d.ts 中有属于 namespace Aclass Foo

      export as namespace A; 只声明命名空间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-13
        • 1970-01-01
        • 1970-01-01
        • 2016-03-08
        • 1970-01-01
        相关资源
        最近更新 更多