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.
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}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}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ę.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}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}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!