# Les types génériques
Il sera certainement très utile dans votre application d'utiliser des types génériques.
Prenons l'exemple d'une réponse de liste à une requête dans laquelle vous envoyer tous les items via une liste du type de l'item (items
) ainsi que la taille de la liste (count
).
Sous forme de class:
class Response<Type> {
items: Type;
count: Number;
}
Pour faire ceci avec les décorateurs nous devons utiliser une méthode peu commune: une fonction retournant une class !
# Processus de création d'un type générique
# Déclaration de la class de base
Uniquement le champ number est décoré, car les items n'ont pas de type déterminé à cet instant.
La classe est en hidden, car elle sert de modèle pour les types qui vont être créés à partir de celle-ci.
@ObjectType({ hidden: true })
abstract class GenericResponse<Type> {
@Field()
count: Number;
items: Type[];
}
# Déclaration du créateur de type
Vous allez devoir utiliser la valeur de la class passé en paramètre pour le décorateur @Field
et le type passé par paramètre générique à la fonction pour déclarer le type du champ de la class.
import { ClassType } from "graphql-composer";
function createResponse<ItemsType extends ClassType>(itemsType: ItemsType) {
@ObjectType()
class Response extends GenericResponse<ItemsType> {
@Field(type => [itemsType])
items: ItemsType[]
}
return Response as ClassType;
}
Enfin pour utiliser notre type générique:
@ObjectType()
class User {
@Field()
username: string;
@Field()
email: string;
}
const userResponse = createResponse(User);
@Resolver()
class R {
@Query(type => userResponse)
query(): GenericResponse<User> {
// ...
}
}
← L'héritage Field →