web-dev-qa-db-ja.com

TypeScriptジェネリックに対して複数の型制約を指定できますか

私は単一の型制約を持つこの例のような一般的なインターフェースを持っています:

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

1つだけではなく、複数の型制約を指定することは可能ですか?

62
Fenton

TypeScriptは、Union型とIntersection型をサポートしています。あなたの場合、交差点が必要です:

interface Example<T extends MyClass & OtherClass> {}

両方のタイプのUnionの場合:

interface Example<T extends MyClass | OtherClass> {}
66
STO

これを回避するには、スーパーインターフェイスを使用します(「インターフェイスがクラスから継承できるようにする理由」という質問にも答えます)。

interface ISuperInterface extends MyClass, OtherClass {

}

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

クラスに由来するインターフェースに関するコメントを参照してください...名前は何ですか?

0.9.0仕様のセクション3.5でこれを見つけました。

インターフェイス宣言は名前付きタイプのみを導入しますが、クラス宣言は名前付きタイプとそれらの名前付きタイプの実装のインスタンスを作成するコンストラクター関数を導入します。クラスとインターフェイスの宣言によって導入された名前付き型にはわずかな違いしかなく(クラスはオプションのメンバーを宣言できず、インターフェイスはプライベートメンバーを宣言できません)、ほとんどのコンテキストで互換性があります。特に、パブリックメンバのみを持つクラス宣言では、インターフェイス宣言で作成されたものとまったく同じように機能する名前付き型が導入されます。

1
andyks