2017-04-05 11 views
0

と名前空間のためにマージ:これはTS 2.0/2.2でうまくコンパイル活字体 - 宣言私は次のような活字体宣言ファイル持つクラス

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

declare namespace foo { 
    interface bar { 

    } 
} 

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

を。ただし、名前空間にclassが含まれている場合(例: barをクラスに変更し、class bamなどを追加する。 - Typescriptは、2つの宣言行に対して、TS2300: Duplicate identifier 'foo'.というエラーをスローする。書かれたコードの目的は、TypescriptのDeclaration Mergingを利用することです。fooにはinterfaceが含まれていると、コードは期待通りに機能します(typefooにも含まれているようです)。 fooclassが含まれていると、宣言のマージが失敗するのはなぜですか?

答えて

2

これはclassが具体的であるためです。 namespaceは、型のみを含む場合、またはコードを含む場合の動作が異なります。

コードを含む場合は、値も出力されます。すなわちnamespace xvar 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

関連する問題