Passer au contenu

Types mappés

En construisant des fonctionnalités telles que CRUD (Créer/Lire/Mettre à jour/Supprimer), il est souvent utile de créer des variantes d’un type d’entité de base. Nest fournit plusieurs fonctions utilitaires qui effectuent des transformations de type pour rendre cette tâche plus pratique.

Partiel

Lorsque vous construisez des types de validation d’entrée (également appelés objets de transfert de données ou DTO), il est souvent utile de créer des variantes de création et de mise à jour du même type. Par exemple, la variante de création peut nécessiter tous les champs, tandis que la variante de mise à jour peut rendre tous les champs optionnels.

Nest fournit la fonction utilitaire PartialType() pour faciliter cette tâche et minimiser le code repetitif.

La fonction PartialType() renvoie un type (classe) avec toutes les propriétés du type d’entrée définies comme optionnelles. Par exemple, supposons que nous ayons un type de création comme suit :

CreateUserInput
@InputType()
class CreateUserInput {
@Field()
email: string;
@Field()
password: string;
@Field()
firstName: string;
}

Par défaut, tous ces champs sont obligatoires. Pour créer un type avec les mêmes champs, mais avec chacun optionnel, utilisez PartialType() en passant la référence de classe (CreateUserInput) comme argument :

UpdateUserInput
@InputType()
export class UpdateUserInput extends PartialType(CreateUserInput) {}

La fonction PartialType() prend un deuxième argument optionnel qui est une référence à un décorateur. Cet argument peut être utilisé pour modifier la fonction de décorateur appliquée à la classe résultante (enfant). Si non spécifié, la classe enfant utilise effectivement le même décorateur que la classe parent (la classe référencée dans le premier argument). Dans l’exemple ci-dessus, nous étendons CreateUserInput qui est annoté avec le décorateur @InputType(). Puisque nous voulons que UpdateUserInput soit également traité comme s’il était décoré avec @InputType(), nous n’avons pas besoin de passer InputType comme deuxième argument.

Pick

La fonction PickType() construit un nouveau type (classe) en choisissant un ensemble de propriétés d’un type d’entrée. Par exemple, supposons que nous commençons avec un type comme :

CreateUserInput
@InputType()
class CreateUserInput {
@Field()
email: string;
@Field()
password: string;
@Field()
firstName: string;
}

Nous pouvons sélectionner un ensemble de propriétés de cette classe en utilisant la fonction utilitaire PickType() :

UpdateEmailInput
@InputType()
export class UpdateEmailInput extends PickType(CreateUserInput, ['email'] as const) {}

Omettre

La fonction OmitType() construit un type en sélectionnant toutes les propriétés d’un type d’entrée, puis en supprimant un ensemble particulier de clés. Par exemple, supposons que nous commençons avec un type comme :

CreateUserInput
@InputType()
class CreateUserInput {
@Field()
email: string;
@Field()
password: string;
@Field()
firstName: string;
}

Nous pouvons générer un type dérivé qui a chaque propriété sauf email, comme illustré ci-dessous. Dans cette construction, le deuxième argument à OmitType est un tableau de noms de propriétés.

UpdateUserInput
@InputType()
export class UpdateUserInput extends OmitType(CreateUserInput, ['email'] as const) {}

Intersection

La fonction IntersectionType() combine deux types en un nouveau type (classe). Par exemple, supposons que nous commençons avec deux types comme :

CreateUserInput
@InputType()
class CreateUserInput {
@Field()
email: string;
@Field()
password: string;
}
@ObjectType()
export class AdditionalUserInfo {
@Field()
firstName: string;
@Field()
lastName: string;
}

Nous pouvons générer un nouveau type qui combine toutes les propriétés des deux types.

UpdateUserInput
@InputType()
export class UpdateUserInput extends IntersectionType(
CreateUserInput,
AdditionalUserInfo,
) {}

Composition

Les fonctions utilitaires de mapping de types sont composables. Par exemple, ce qui suit produira un type (classe) qui a toutes les propriétés du type CreateUserInput sauf pour email, et ces propriétés seront définies comme optionnelles :

UpdateUserInput
@InputType()
export class UpdateUserInput extends PartialType(
OmitType(CreateUserInput, ['email'] as const),
) {}