この例のように、単一の型制約を持つ汎用インターフェースがあります。
export interface IExample<T extends MyClass> {
getById(id: number): T;
}
1つだけではなく複数の型制約を指定することは可能ですか?
回答:
Typescriptは、ジェネリック型の多重継承を取得するための構文を提供していません。ただし、UnionタイプとIntersectionタイプを使用することで、同様のセマンティクスを実現できます。あなたの場合、あなたは交差点が欲しいです:
interface Example<T extends MyClass & OtherClass> {}
両方のタイプのユニオンの場合:
interface Example<T extends MyClass | OtherClass> {}
<T extends MyInterfaceA & MyInterfaceB>
、タイプは両方のインターフェースを実装する必要があります。
extends A|B
isはAまたはBをextends A & B
拡張し、両方を拡張します。ので、多分あなたは....あなたの答えの両方を指定する必要があります
この回避策は、スーパーインターフェイスを使用することです(これは、「インターフェイスがクラスから継承できるようにする理由」という質問にも答えます)。
interface ISuperInterface extends MyClass, OtherClass {
}
export interface IExample<T extends ISuperInterface> {
getById(id: number): T;
}
クラスから派生したインターフェースについてのコメントを参照してください...名前には何が含まれていますか?
0.9.0仕様のセクション3.5でこれを見つけました:
インターフェイス宣言は名前付き型のみを導入しますが、クラス宣言は名前付き型とそれらの名前付き型の実装のインスタンスを作成するコンストラクター関数を導入します。クラス宣言とインターフェイス宣言によって導入された名前付きタイプには、わずかな違いしかなく(クラスはオプションのメンバーを宣言できず、インターフェイスはプライベートメンバーを宣言できません)、ほとんどのコンテキストで交換可能です。特に、パブリックメンバーのみを含むクラス宣言では、インターフェイス宣言によって作成されたものとまったく同じように機能する名前付き型が導入されます。