2017-08-22 23 views
3

は以下の活字考えてみましょう:原因活字体はJavaScriptにコンパイルする方法に同じ名前の現在の名前空間の外で宣言された名前空間をどのように参照できますか?

export namespace Test { 
    export const test = "test"; 
} 
export namespace Wrapper { 
    export namespace Test { 
     export const value = Test.test; // "<script>".Wrapper.Test has no exported member 'test'. 
    } 
} 

を、WrapperTestの2番目の宣言はTestのみ自身を参照する新しいスコープを作成します。 Testのトップレベルは、少なくともTypeScript型チェッカーによれば、そのスコープ内では使用できません。

私は、この種の名前空間の衝突が大きな問題ではない別の言語からTypeScriptを生成しています。しかし、TypeScriptでは、コンパイルエラーが発生します。アプリケーションはまだ実行されているので、これはTypeScript型のチェック問題であり、実際のJavaScriptランタイムの問題ではないようです。

既知の回避策はありますか?

私はGluon issueに設定された再設定を持っています。

答えて

1

あなたは、名前空間の衝突を克服するために、エイリアスを作成することができます

export namespace Test { 
    export const test = "test"; 
} 

import _Test = Test; 

export namespace Wrapper { 
    export namespace Test { 
     export const value = _Test.test; 
    } 
} 
+0

おかげで、ビルを。私はこれもcodegenできると思うが、これは本当にタイプチェッカの問題でしょうか?実行時に有効なJavaScriptと思われます。 – panesofglass

+0

'namespace'はTypeScript(JavaScriptではない)構造です。関数ラッパーにコンパイルされます。実際にJavaScriptがどのように見えるかを見るためにそれを自分でコンパイルしてください。 JSは実際には上記のように多く見えますが、実際には同じ名前付けの問題があります。 –

+0

TypeScriptチームがこの問題を認識していると思われます。[グローバルスコープリファレンスを導入するためのこの機能要求の不承認](https://github.com/Microsoft/TypeScript/issues/983)Anders Hejlsberg –

関連する問題