2017-04-05 82 views
0

我有一个打字稿声明文件看起来像以下:打字稿 - 声明合并为命名空间与类

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

declare namespace foo { 
    interface bar { 

    } 
} 

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

这将编译只是TS 2.0/2.2的罚款。但是,如果命名空间包含任何class - 例如改变bar一类,加入另一class bam等 - 打字稿引发错误TS2300: Duplicate identifier 'foo'.,对于两个DECLARE线。作为编写的代码的目的是利用宣言的打字稿合并,而当foo只包含interface S,代码工作正常(type小号似乎罚款foo包括,太)。为什么声明合并失败,如果foo包含任何class上课?

回答

2

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

当它包含代码,它也将发射值。即namespace x将变为var x

当它不包含代码,没有代码将被发射。

这就是为什么当它包含类时,它会发出var foo,因此与const foo发生冲突。

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