2017-04-05 83 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