打字稿 - 声明命名空间与类的合并

时间:2017-04-05 17:36:52

标签: typescript

我有一个类型脚本声明文件,如下所示:

/// <reference types="node" />

declare namespace foo {
    interface bar {

    }
}

declare const foo: foo.bar;
export = foo;

这与TS 2.0 / 2.2编译得很好。但是,如果命名空间包含任何class - 例如将bar更改为某个类,添加另一个class bam等。 - Typescript会为两个声明行抛出错误TS2300: Duplicate identifier 'foo'.。编写的代码的目标是利用Typescript中的声明合并,当foo仅包含interface时,代码按预期工作(type似乎可以包含在foo也是。如果foo包含任何class es?

,为什么声明合并失败

1 个答案:

答案 0 :(得分:2)

这是因为class具体。当namespace仅包含类型或包含代码时,namespace x的行为会有所不同。

当它包含代码时,它也会发出值。即var x将成为var foo

如果它不包含代码,则不会发出任何代码。

这就是为什么当它包含类时,它会发出const foo因此与你的bash -c冲突。

https://www.typescriptlang.org/docs/handbook/declaration-merging.html

这是一个演示: http://www.typescriptlang.org/play/index.html#src=namespace%20foo%20%7B%0D%0A%20%20interface%20x%20%7B%20%7D%0D%0A%7D%0D%0A%0D%0Anamespace%20boo%20%7B%0D%0A%20%20class%20y%20%7B%20%7D%0D%0A%7D