Usamos cookies para mejorar tu experiencia en el sitio
CodeWorlds

Zaawansowane dekoratory walidacji

Podstawowi strażnicy bramy znasz już całkiem nieźle. Teraz czas poznać elitarnych gwardzistów — zaawansowane dekoratory class-validator, które radzą sobie z bardziej skomplikowanymi sytuacjami.

@IsOptional() — strażnik wartości opcjonalnych

Nie każde pole musi być obowiązkowe. Dekorator

@IsOptional()
mówi: "Jeśli to pole istnieje, sprawdź je. Jeśli nie istnieje — przepuść":

1import { IsOptional, IsString, IsNumber } from 'class-validator';
2
3export class UpdateLegionaryDto {
4  @IsOptional()
5  @IsString()
6  nickname?: string;  // Może nie mieć pseudonimu
7
8  @IsOptional()
9  @IsNumber()
10  bonusPay?: number;  // Dodatkowy żołd jest opcjonalny
11}

@IsEnum() — strażnik dozwolonych wartości

Gdy pole może przyjmować tylko określone wartości, używamy

@IsEnum()
. To jak lista dozwolonych rang w legionie:

1import { IsEnum } from 'class-validator';
2
3enum LegionaryRank {
4  MILES = 'miles',
5  OPTIO = 'optio',
6  CENTURIO = 'centurio',
7  LEGATUS = 'legatus',
8}
9
10export class CreateLegionaryDto {
11  @IsEnum(LegionaryRank)
12  rank: LegionaryRank;
13  // 'centurio' ✅, 'imperator' ❌
14}

@IsArray() i @ArrayMinSize() — strażnicy tablic

Gdy oczekujesz tablicy danych, potrzebujesz specjalnych strażników:

1import { IsArray, ArrayMinSize, IsString } from 'class-validator';
2
3export class CreateLegioDto {
4  @IsArray()
5  @ArrayMinSize(1)
6  @IsString({ each: true })
7  skills: string[];
8  // ["combat", "march"] ✅, [] ❌, "combat" ❌
9}

Zwróć uwagę na

{ each: true }
— ten parametr mówi dekoratorowi
@IsString()
, żeby sprawdził każdy element tablicy, a nie samą tablicę.

@IsDateString() — strażnik dat

Weryfikuje, czy wartość jest poprawnym łańcuchem daty w formacie ISO 8601:

1import { IsDateString } from 'class-validator';
2
3export class CreateEventDto {
4  @IsDateString()
5  enlistmentDate: string;
6  // "2024-03-15T10:00:00Z" ✅, "wczoraj" ❌
7}

@Matches() — strażnik wzorców (regex)

Najuniwersalniejszy strażnik — sprawdza, czy wartość pasuje do wyrażenia regularnego:

1import { Matches, IsString } from 'class-validator';
2
3export class CreateLegionaryDto {
4  @IsString()
5  @Matches(/^LEG-[A-Z]{3}-\d{4}$/, {
6    message: 'Numer identyfikacyjny musi mieć format LEG-XXX-0000',
7  })
8  militaryId: string;
9  // "LEG-ROM-0042" ✅, "123ABC" ❌
10}

Pełny przykład — formularz rekrutacji do legionu

Połączmy wszystkie zaawansowane dekoratory w kompletnym DTO:

1import {
2  IsString,
3  IsNotEmpty,
4  IsEnum,
5  IsOptional,
6  IsArray,
7  ArrayMinSize,
8  IsDateString,
9  Matches,
10  IsNumber,
11  Min,
12  Max,
13  MinLength,
14} from 'class-validator';
15
16enum LegionaryRank {
17  MILES = 'miles',
18  OPTIO = 'optio',
19  CENTURIO = 'centurio',
20  LEGATUS = 'legatus',
21}
22
23export class RecruitLegionaryDto {
24  @IsString()
25  @IsNotEmpty()
26  @MinLength(2)
27  name: string;
28
29  @IsEnum(LegionaryRank)
30  rank: LegionaryRank;
31
32  @IsNumber()
33  @Min(16)
34  @Max(65)
35  age: number;
36
37  @IsDateString()
38  enlistmentDate: string;
39
40  @Matches(/^LEG-[A-Z]{3}-\d{4}$/)
41  militaryId: string;
42
43  @IsArray()
44  @ArrayMinSize(1)
45  @IsString({ each: true })
46  skills: string[];
47
48  @IsOptional()
49  @IsString()
50  nickname?: string;
51}

Mając te dekoratory w swoim arsenale, możesz walidować praktycznie dowolne dane. Strażnicy bramy twojego API są teraz dobrze wyszkoleni!

Ir a CodeWorlds