web-dev-qa-db-fra.com

Pouvez-vous spécifier plusieurs contraintes de type pour les génériques TypeScript

J'ai une interface générique comme cet exemple avec une contrainte de type unique:

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

Est-il possible de spécifier plusieurs contraintes de type au lieu d'une seule?

62
Fenton

TypeScript prend en charge les types Union et les types Intersection. Dans votre cas, vous souhaitez une intersection:

interface Example<T extends MyClass & OtherClass> {}

Pour une union des deux types:

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

Un moyen de contourner ce problème serait d'utiliser une super-interface (qui répond également à la question "pourquoi autoriseriez-vous une interface à hériter d'une classe").

interface ISuperInterface extends MyClass, OtherClass {

}

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

Réf le commentaire sur une interface dérivant d'une classe ... que contient un nom?

J'ai trouvé cela dans la section 3.5 de la spécification 0.9.0:

Les déclarations d'interface n'introduisent que des types nommés, tandis que les déclarations de classe introduisent des types nommés et des fonctions constructeurs qui créent des instances d'implémentations de ces types nommés. Les types nommés introduits par les déclarations de classe et d'interface n'ont que des différences mineures (les classes ne peuvent pas déclarer de membres facultatifs et les interfaces ne peuvent pas déclarer de membres privés) et sont dans la plupart des contextes interchangeables. En particulier, les déclarations de classe avec uniquement des membres publics introduisent des types nommés qui fonctionnent exactement comme ceux créés par les déclarations d'interface.

1
andyks