В библиотеке class-validator механизм групп валидации
используется для управления тем, какие правила применяются в разных
сценариях работы с одной и той же моделью данных. Группы позволяют
разделять бизнес-логики валидации, например: создание сущности,
обновление, частичная проверка, административные операции.
Параметр strictGroups напрямую влияет на то, как
библиотека обрабатывает указанные группы и насколько строго она следует
им при выполнении валидации.
Каждый валидатор в class-validator может быть привязан к
одной или нескольким группам:
@IsString({ groups: ['create'] })@IsOptional({ groups: ['update'] })При вызове validate() можно указать, какие группы должны
быть активны:
validate(user, { groups: ['create'] });
В этом случае будут применены только те правила, которые принадлежат
группе create.
По умолчанию поведение библиотеки менее строгое:
Пример:
class User {
@IsString()
name: string;
@IsEmail({ groups: ['create'] })
email: string;
}
Валидация:
validate(user, { groups: ['create'] });
Результат:
name проверяется всегдаemail проверяется только в группе
createТаким образом, отсутствие групп у декоратора делает его глобальным.
Параметр strictGroups активируется при вызове
validate:
validate(user, {
groups: ['create'],
strictGroups: true,
});
Он изменяет правило интерпретации групп:
валидируются только те декораторы, которые явно принадлежат указанным группам
При strictGroups: true:
class Product {
@IsString()
title: string;
@IsNumber({ groups: ['create'] })
price: number;
}
validate(product, { groups: ['create'] });
Результат:
title проверяется всегдаprice проверяется только в createvalidate(product, {
groups: ['create'],
strictGroups: true,
});
Результат:
title НЕ проверяетсяprice проверяетсяИспользование strictGroups меняет философию валидации с
«глобальной модели с исключениями» на «строго изолированные
сценарии».
Это особенно важно в системах, где:
class UserDto {
@IsString({ groups: ['create', 'update'] })
username: string;
@IsEmail({ groups: ['create'] })
email: string;
@IsOptional({ groups: ['update'] })
password: string;
}
При strictGroups: true:
createupdateclass Account {
@IsString()
name: string;
@IsBoolean({ groups: ['admin'] })
isBlocked: boolean;
}
validate(account, {
groups: ['admin'],
strictGroups: true,
});
В этом режиме пользовательские проверки не применяются, если они не
входят в admin.
Использование strictGroups требует более
дисциплинированного подхода к моделям:
Это приводит к более явному контракту данных.
@IsString()
name: string;
При strictGroups: true это поле никогда не будет
валидироваться, если не указаны группы.
@IsEmail({ groups: ['create'] })
email: string;
При валидации update поле перестаёт проверяться
полностью, если не добавлена соответствующая группа.
Когда разные разработчики добавляют декораторы без согласования
групп, поведение модели становится непредсказуемым при включённом
strictGroups.
alwaysДекоратор может быть помечен как:
@IsString({ always: true })
Но при включённом strictGroups приоритет имеет группа, и
always не гарантирует выполнение, если нет пересечения с
активной группой.
skipMissingPropertiesВ комбинации:
validate(dto, {
groups: ['update'],
strictGroups: true,
skipMissingProperties: true,
});
Если:
validate(user, {
groups: [],
strictGroups: true,
});
Результат:
strictGroups такие декораторы также
игнорируютсяstrictGroups переводит систему валидации в режим:
Это делает поведение более предсказуемым в больших приложениях, где одна DTO используется в нескольких контекстах.
При включённом strictGroups:
groups становится фильтром строгого включения, а не
расширения логики