2017-05-04 10 views
1

モジュールと名前空間についての情報をクリアするためにTypescriptのドキュメントを読んだことがありますが、まだ暗い点があります。名前空間を作成するには、これらの3つの方法の中でTypescript 2.xで名前空間を作成

  1. declare namespace Foo{}
  2. namespace Foo{}
  3. export namespace Foo{}

、それぞれの使用目的は何ですか?

バリデーション名前空間を作成し、その名前空間に貢献する3つのファイルがあるとします。これを行う正しい方法と、別のファイル/モジュールからバリデーション名前空間のコードをインポート(使用)する方法は何ですか?

答えて

2

バリデーションネームスペースのコードを別のファイル/モジュールからインポート(使用)する方法はありますか?

1つの質問で「インポート(使用)」と「ファイル/モジュール」と言っているときは、非常に異なる2つの状況について質問しています。答えはそれぞれ異なります。

importとモジュールでこれを行う方法はありません。各モジュールは異なるスコープであり、各モジュールにnamespace Validationを定義すると、異なるスコープの宣言がマージされないため、3つの異なる名前空間を作成します。さて、あなたはdeclare globalを使ってモジュールスコープから抜け出すことができますが、それはモジュールの指定された目的を破ります - グローバルの除去。

これは、モジュールではないファイル(つまり、トップレベルのファイルがimportまたはexportでないファイル)で行うことができます。しかし、あなたは非モジュラーのjavascript(またはtypescript)に制限されています。 namespace Validationはグローバルスコープになります。importとモジュールを使用することはできません。すべてのファイルをコンパイルして連結して、<script>タグをロードするのに適した単一のスクリプトを生成する必要があります。

も参照してくださいHow do I use namespaces with TypeScript external modules?

これはFooどれを使用できるように、いくつかの外部ファイル(現在のコンパイルに含まれていない)で定義された名前空間Fooのは、そこに存在することを宣言し

declare namespace Foo {} 

特定の構文バリアントについて {}の中に宣言されたものを含むものとします(そして、 {}は宣言のみを含み、定義はここに含まれません)。

namespace Foo {} 

これは、これはまた、名前空間のFooを作成しますが、exportが、それはソースファイルに表示される場所に応じて、異なる意味を持つことができ、名前空間Foo

export namespace Foo {} 

を作成します(それはまた、ファイルがモジュールであるかどうかに依存しますしかし、私はexportがモジュールなしでどのように役立つかの詳細に行きたくはありません。

exportが最上位にある場合は、ファイルをモジュールに変換し、Fooを他のモジュールでインポートして使用できます(拡張はできません)。 exportがトップレベルにない場合は、再びそれが依存します。エクスポートされた名前空間に含まれている場合は、ネストされた名前空間を定義し、その外部名前空間をインポートしたモジュールがアクセスできます。それがエクスポートされていない名前空間にある場合、exportは私が信じる効果がありません。

関連する問題