2016-10-07 10 views
1

名前空間(内部モジュール)内でのみ使用したいインターフェイスがあり、名前空間の外側で使用しないでください。TypeScript:名前空間内での内部インターフェイスの使用方法

例インタフェース:

namespace Test { 
    interface IInterface { 
     getId(): number; 
     getName(): string; 
    } 
} 

私は(私はしたくない)インターフェースをエクスポートしていない場合は、同じ名前空間内このインタフェースを実装しようとすると、残念ながら、私はエラーを取得します。

実装クラス:与え

namespace Test { 
    class Implementer implements IInterface { 
     private location: Location; 

     public getId(): number { 
      return 1; 
     } 

     public getName(): string { 
      return "implementer name"; 
     } 
    } 
} 

TS2304は:名 'メソッドはIInterface' を見つけることができません。 'Implementer.ts'の

「Location」タイプのプライベートメンバーは、同じ名前空間で自分自身で定義された新しいタイプ/クラスでもあり、タイプ 'Location'が既にグローバルスペースに存在するため、名前空間を使用する実際の理由です。矛盾した名前の

クラスの名前空間外で使用する場合:さらに

namespace Test { 
    class Location { 
     private name: string = null; 
     constructor(name: string) { 
      this.name = name; 
     } 
    } 
} 

:私はすべてのモジュールを使用していないと私はクラスを活字するためにJavaScriptからのいくつかのタイプを変換しています。 /// <reference path="IInterface.ts" />ヘルパーを使用しても機能しません(問題はありません)。私はまた、モジュールローダを導入したくありません。

したがって、インターフェイスをエクスポートせずに同じ名前空間で使用するにはどうすればよいですか?

+0

多分関連性があります:http://stackoverflow.com/questions/39827281/modules-vs-namespaces-what-is-the-correct-way-to-organize-a-large-typescript-p/39827997#39827997 – Paleo

+0

もう1つの質問は、内部インターフェイスや名前ペースやモジュール内のインターフェイスのアクセシビリティについては言及していません。 – Huupke

+0

はい、新しいプロジェクトを開始する場合は、モジュールに切り替えることを検討する必要があります。それは単なる提案です。 :) – Paleo

答えて

1

私は最後の質問に最初に答えます: "名前空間の外で使用される場合、競合する名前を持つクラス"。 A global object Locationが既にブラウザに存在しています。この名前は、モジュールまたはネームスペース内のクラスに使用できます。それ以外の場合は、別の名前を選択する必要があります。

次に、名前空間を分割したいとします。ただ、exportメンバーIInterface生命維持の外にそれを公開するために:

namespace Test { 
    export interface IInterface { 
     getId(): number; 
     getName(): string; 
    } 
} 

説明the handbookから

名前空間は、単にグローバル名前空間内のJavaScriptオブジェクトを命名しています。

ここでは、説明(コードin the TS Playgroundを参照):コンパイル後

namespace Test { 
    export let name = 'abc' 
} 

namespace Test { 
    let message = 'Hello, ' + name; 
} 

、ここではJavaScriptコードは次のとおりです。

var Test; 
(function (Test) { 
    Test.name = 'abc'; 
})(Test || (Test = {})); 

var Test; 
(function (Test) { 
    var message = 'Hello, ' + Test.name; 
})(Test || (Test = {})); 

名前空間Testは単に名前の」でありますグローバル名前空間内のJavaScriptオブジェクト "。変数messageはIIFEの外で再利用できないことがわかります。同じグローバル変数(名前空間)の3番目のIIFEを作成したとしても、Test

+1

最初にエクスポートすると、インターフェイスがネームスペースまたはモジュールの外部からアクセス可能になり、不要になります。すでに存在する名前の問題は、自分のオブジェクトの名前を変更して処理するべきではありません。名前空間とモジュールは主にこの問題を解決するためのものです。 – Huupke

+0

@Huupke、私は説明を追加しました。 – Paleo

関連する問題