2013-06-15 9 views

答えて

30

ことが可能である

interface Example<T extends MyClass | OtherClass> { 

} 
+2

制約の唯一の目的のためにインターフェイスを作成する必要がないので、これを実現するためには連合型が最適です。彼らは2013年には存在しませんでしたが、これは今私が今それをやることをお勧めします。 – Fenton

+4

この回答は間違っています。連合型は、2つの異なる型を拡張するのと同じセマンティクスを持ちません。 – AlexG

+2

@AlexG確かにこれは2つのタイプの_extending_と同じではありませんが、_implementing_ 2つのインターフェースと同じです。 – STO

23

この問題を回避するには、スーパーインタフェースを使用することです(これは、「なぜインタフェースがクラスから継承するのを許可するのでしょうか」という質問にも答えています)。

interface ISuperInterface extends MyClass, OtherClass { 

} 

export interface IExample<T extends ISuperInterface> { 
    getById(id: number): T; 
} 
+10

これは適切なソリューションです。しかし、2つのクラスからインターフェイスを拡張することは恐ろしいことですが、両方ともプライベートメンバーを宣言すると、インターフェイスは満たされません。 –

+1

あなたは紳士で学者です!ありがとうございました。 – Fenton

1

クラスから派生したインターフェイスについてのコメントを参照してください。

私は0.9.0仕様のセクション3.5でこれを見つけた:

クラス 宣言は、これらの名前付きの型の実装のインスタンスを作成 名前付きの型とコンストラクタ関数を導入し、一方、インタフェースの宣言だけで、名前付きの型を導入。 クラスとインターフェイスの宣言によって導入された型は、 という相違点しかありません(クラスは省略可能なメンバを宣言することができず、 はプライベートメンバを宣言できません)。 は互換性があります。特に、publicである メンバーのクラス宣言では、インターフェイス宣言によって で作成されたものとまったく同じように機能する名前付き型が導入されています。組合の種類をサポートしtypescriptですでは

+0

オプションのクラスメンバーが実装されました:https://github.com/Microsoft/TypeScript/pull/8625 –

関連する問題