2017-12-21 16 views
2

[OK]を私は、マルチコードベースのプロジェクトを持っているので、宣言クラス定義

私は、コードベースのP1内のクラスがあります。

class ClassInP1 { 


} 

を私はで参照されるように、そのクラスのタイプを必要とします別のコードベースのP2ですが、私はP2の依存としてP1をインストールしたくありません。 クリアする:P1はP2をインポートしますが、P2はP1をインポートしたくありません!

P2でインターフェイスを作成し、ClassInP1でそのインターフェイスを実装するには、これを行う最善の方法はありますか?これと同じように:

import {InterfaceFromP2} from 'P2'; 

class ClassInP1 implements InterfaceFromP2 { 



} 

ことについてだけ迷惑な事、それはDRY..theクラスはかなり自己文書となり、100%ではないのですが、その後、私はインターフェイスのそれの多くが重複していますが、ということです私はそれが大きな問題ではないと思う。

答えて

1

注:ここでは名前空間を使用してスタンドアロンのデモンストレーションを作成しています。名前空間は概念を示していますが、この作業を行うためには必要ありません。

TypeScriptは構造的に美しく、名前はネーミングコンテキスト内で何かを識別する限り重要です。型の使用に関しては、互換性がある(必要な構造を持つ)必要があります。

namespace A { 
    export class ExampleOne { 
     name: string; 
     size: number; 
    } 
} 

namespace B { 
    export class ExampleOne { 
     name: string; 
     size: number; 
    } 

    export class ExampleTwo { 
     name: string; 
     size: number; 
     volume: number; 
    } 
} 

function logExample(example: A.ExampleOne) { 
    console.log(example.name); 
} 

logExample(new A.ExampleOne()); 

logExample(new B.ExampleOne()); 

logExample(new B.ExampleTwo()); 

私は、任意のネーミングコンテキスト(名前空間、モジュール)で名前ExampleOneを再使用することができます。

A.ExampleOneと互換性のある値をlogExample関数に渡すことができます。構造的に互換性がある限り、正確なクラス、サブクラス、またはクラスである必要はありません。

だから、元ClassInP1から継承しなければ

class ClassInP1 

} 

を持っている、とのインタフェースを作成することなくすることができます。

+0

私はこれを数回読んで、それがOPとどのように関係しているかを理解するのに苦労しています。 OPと同じクラス名を使うことができれば、それは私の考えを助けるだろう。名前空間が質問に答える必要がない場合、答えからそれらを落とすかもしれませんか? dunno –

+0

- 私は実際にクラスでそれらを実装せずにプロトタイプメソッドを定義する方法がわかりません - おそらくあなたはそれを行うために 'typeof'を使うことができるでしょうか? –

+0

あなたはポイントを作っています。何かがインタフェースに準拠していれば、実際に階層内に正しい名前を持つ必要はありません。名前には任意の名前を付けることができます。しかし残念ながら、これは私がクラス/インターフェースを2回実装することを妨げるものではありません。 –

関連する問題