Параметр skipMissingProperties относится к опциям
функции validate и validateSync библиотеки
class-validator и управляет тем, будут ли проверяться
свойства, отсутствующие в объекте в момент валидации.
При включении skipMissingProperties: true все свойства
DTO, которые не присутствуют в объекте, исключаются из
процесса валидации. Это означает:
@IsString, @IsNumber и т.д.)
для таких полей не выполняются;Если параметр отключён (false или не задан), то:
import { validate } from "class-validator";
import { IsString, IsInt } from "class-validator";
class UserDto {
@IsString()
name;
@IsInt()
age;
}
const dto = {
name: "Alex"
};
validate(dto, { skipMissingProperties: true }).then(errors => {
console.log(errors);
});
В данном случае:
name проверяется;age отсутствует, но ошибка не возникает, потому что
включён skipMissingProperties.validate(dto, { skipMissingProperties: false });
Результат:
age отсутствует;@IsInt() не получает значение;skipMissingProperties тесно связан с семантикой
HTTP-методов:
PUT — полное обновление ресурса Все поля должны быть переданы, валидация строгая.
PATCH — частичное обновление Передаются только изменяемые поля.
Для PATCH типичная конфигурация:
validate(dto, { skipMissingProperties: true });
Это позволяет:
Важно различать skipMissingProperties и декоратор
@IsOptional.
import { IsOptional, IsString } from "class-validator";
class UserDto {
@IsOptional()
@IsString()
nickname;
}
@IsOptional() — применяется на уровне
поля;skipMissingProperties — применяется на уровне
всей валидации.Различия:
@IsOptional() отключает валидацию только для
undefined значений конкретного свойства;skipMissingProperties полностью исключает отсутствующее
поле из проверки, независимо от декораторов.Комбинация часто используется для гибкой обработки частичных DTO.
В некоторых версиях или конфигурациях можно встретить похожий
параметр skipUndefinedProperties.
Разграничение:
skipMissingProperties — пропускает свойства, которых
нет в объекте вообще;skipUndefinedProperties — пропускает свойства, которые
существуют, но равны undefined.Пример различия:
const dto = {
name: undefined
};
skipMissingProperties: true поле считается
отсутствующим и игнорируется;skipUndefinedProperties: true также игнорируется,
но при этом поле формально существует.При использовании с ValidateNested поведение
распространяется рекурсивно:
import { ValidateNested, IsString } from "class-validator";
class ProfileDto {
@IsString()
bio;
}
class UserDto {
@ValidateNested()
profile;
}
Если profile отсутствует в объекте и включён
skipMissingProperties, то:
ProfileDto не запускается;В связке с class-transformer поведение становится более
предсказуемым при обработке входных данных API:
import { plainToInstance } from "class-transformer";
import { validate } from "class-validator";
const dto = plainToInstance(UserDto, requestBody);
validate(dto, { skipMissingProperties: true });
Если поле не пришло в requestBody:
Ожидание, что skipMissingProperties заменяет
@IsOptional() Это разные механизмы, работающие на разных
уровнях.
Использование для обязательных бизнес-полей При включении параметра можно случайно пропустить критически важные проверки.
Игнорирование вложенных объектов Часто ожидается, что nested-валидация будет строгой, но она также пропускается при отсутствии данных.
Комбинация декораторов и опций формирует итоговую модель:
skipMissingProperties: true;@IsOptional() дополнительно смягчает поведение на
уровне свойства;ValidateNested() активируется только при наличии
вложенного объекта.Так формируется гибкий механизм, позволяющий адаптировать одну и ту же DTO-модель под разные сценарии обработки входных данных без дублирования классов.