Passer au contenu

Types Mappés

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

Partiel

Lorsque vous créez des types de validation d’entrée (également appelés DTO), il est souvent utile de construire des variations create et update sur le même type. Par exemple, la variante create peut exiger tous les champs, tandis que la variante update peut rendre tous les champs facultatifs.

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

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

CreateCatDto
import { ApiProperty } from '@nestjs/swagger';
export class CreateCatDto {
@ApiProperty()
name: string;
@ApiProperty()
age: number;
@ApiProperty()
breed: string;
}

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

UpdateCatDto
export class UpdateCatDto extends PartialType(CreateCatDto) {}

Choisir

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

CreateCatDto
import { ApiProperty } from '@nestjs/swagger';
export class CreateCatDto {
@ApiProperty()
name: string;
@ApiProperty()
age: number;
@ApiProperty()
breed: string;
}

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

UpdateCatAgeDto
export class UpdateCatAgeDto extends PickType(CreateCatDto, ['age'] as const) {}

Omettre

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

CreateCatDto
import { ApiProperty } from '@nestjs/swagger';
export class CreateCatDto {
@ApiProperty()
name: string;
@ApiProperty()
age: number;
@ApiProperty()
breed: string;
}

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

UpdateCatDto
export class UpdateCatDto extends OmitType(CreateCatDto, ['name'] as const) {}

Intersection

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

CreateCatDto
import { ApiProperty } from '@nestjs/swagger';
export class CreateCatDto {
@ApiProperty()
name: string;
@ApiProperty()
breed: string;
}
export class AdditionalCatInfo {
@ApiProperty()
color: string;
}

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

UpdateCatDto
export class UpdateCatDto extends IntersectionType(
CreateCatDto,
AdditionalCatInfo,
) {}

Composition

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

UpdateCatDto
export class UpdateCatDto extends PartialType(
OmitType(CreateCatDto, ['name'] as const),
) {}