Декоратор @IsEmpty из библиотеки class-validator
используется для проверки того, что значение свойства отсутствует.
Валидатор считается успешным только в том случае, если поле равно:
'' — пустая строка;null;undefined.Любое другое значение приводит к ошибке валидации.
@IsEmpty@IsEmpty применяется в ситуациях, когда свойство
объекта:
Типичные примеры:
role, которое назначается только сервером;npm install class-validator class-transformer
Для поддержки декораторов в TypeScript требуется
включить параметры:
{
"experimentalDecorators": true,
"emitDecoratorMetadata": true
}
import { validate } from 'class-validator';
import { IsEmpty } from 'class-validator';
class CreateUserDto {
@IsEmpty()
role: string;
}
const dto = new CreateUserDto();
dto.role = 'admin';
validate(dto).then(errors => {
console.log(errors);
});
Результат:
[
ValidationError {
property: 'role',
constraints: {
isEmpty: 'role must be empty'
}
}
]
Поле содержит значение 'admin', поэтому проверка не
проходит.
undefinedclass CreateUserDto {
@IsEmpty()
role?: string;
}
const dto = new CreateUserDto();
Ошибок не будет.
nullclass CreateUserDto {
@IsEmpty()
role: null;
}
const dto = new CreateUserDto();
dto.role = null;
Проверка успешно пройдёт.
class CreateUserDto {
@IsEmpty()
comment: string;
}
const dto = new CreateUserDto();
dto.comment = '';
Валидация также завершится успешно.
Следующие значения НЕ проходят проверку @IsEmpty:
'text'
0
false
[]
{}
NaN
true
Пример:
class TestDto {
@IsEmpty()
value: any;
}
const dto = new TestDto();
dto.value = false;
Результат:
value must be empty
Даже false считается непустым значением.
class ProductDto {
@IsEmpty()
quantity: number;
}
dto.quantity = 0;
Ошибка:
quantity must be empty
class TagsDto {
@IsEmpty()
tags: string[];
}
dto.tags = [];
Ошибка валидации всё равно возникнет.
Пустой массив не считается пустым значением для
@IsEmpty.
class ConfigDto {
@IsEmpty()
options: object;
}
dto.options = {};
Проверка завершится ошибкой.
class RegisterDto {
username: string;
password: string;
@IsEmpty()
role: string;
}
Пользователь не сможет самостоятельно передать роль:
{
"username": "alex",
"password": "123456",
"role": "admin"
}
Валидация завершится ошибкой.
class OrderDto {
productId: number;
@IsEmpty()
status: string;
}
Статус заказа назначается сервером:
order.status = 'pending';
Клиент не должен иметь возможность задавать это поле вручную.
class ArticleDto {
title: string;
content: string;
@IsEmpty()
publishedAt: Date;
}
Дата публикации может выставляться только после модерации.
class UserDto {
@IsEmpty({
message: 'Поле role запрещено для заполнения'
})
role: string;
}
class UserDto {
@IsEmpty({
message: args => {
return `Свойство ${args.property} должно быть пустым`;
}
})
role: string;
}
skipMissingPropertiesПараметр skipMissingProperties влияет на обработку
отсутствующих полей.
Пример:
validate(dto, {
skipMissingProperties: true
});
Однако @IsEmpty проверяет именно пустоту значения, а не
факт существования свойства.
@IsEmpty от
@IsOptional@IsEmptyТребует, чтобы поле было пустым.
@IsEmpty()
role: string;
Запрещает наличие значения.
@IsOptionalРазрешает отсутствие поля, но не запрещает значение.
@IsOptional()
role?: string;
Если значение передано — остальные валидаторы будут выполнены.
@IsEmpty от
@IsNotEmpty@IsEmpty@IsEmpty()
token: string;
Поле обязано быть пустым.
@IsNotEmpty@IsNotEmpty()
token: string;
Поле обязано содержать значение.
class TestDto {
@IsEmpty()
@IsString()
value: string;
}
Логическое противоречие:
@IsEmpty требует отсутствия значения;@IsString требует строку.import { ValidateIf, IsEmpty, IsString } from 'class-validator';
class UserDto {
isAdmin: boolean;
@ValidateIf(o => !o.isAdmin)
@IsEmpty()
adminComment: string;
@ValidateIf(o => o.isAdmin)
@IsString()
adminComment: string;
}
В проектах на NestJS декоратор часто применяется внутри DTO.
import { IsEmpty } from 'class-validator';
export class CreateUserDto {
username: string;
@IsEmpty()
role: string;
}
При использовании ValidationPipe:
app.useGlobalPipes(new ValidationPipe());
любая попытка передать role приведёт к HTTP-ошибке
400 Bad Request.
export class PaymentDto {
amount: number;
currency: string;
@IsEmpty()
internalTransactionId: string;
}
Даже если клиент вручную отправит:
{
"amount": 100,
"currency": "USD",
"internalTransactionId": "ABC123"
}
валидация не позволит принять запрос.
class-transformerЧасто используется вместе с class-transformer.
import { Expose } from 'class-transformer';
import { IsEmpty } from 'class-validator';
class UserDto {
@Expose()
username: string;
@IsEmpty()
role: string;
}
@IsEmpty никак не влияет на:
Декоратор отвечает исключительно за валидацию.
@IsEmpty()
tags: string[];
tags = [];
Ошибка всё равно возникнет.
@IsEmpty()
@IsNotEmpty()
name: string;
Такой код создаёт невозможное условие.
@IsEmpty()
secret: string;
Декоратор не удаляет поле из объекта.
Внутри библиотеки проверка эквивалентна логике:
value === '' ||
value === null ||
value === undefined
Именно эти значения считаются пустыми.
@IsEmptyПодходящие сценарии:
| Сценарий | Подходит |
|---|---|
| Запрет ручного ввода поля | Да |
| Защита серверных данных | Да |
| Скрытые технические поля | Да |
| Контроль внутренних статусов | Да |
| Проверка пустого массива | Нет |
| Проверка пустого объекта | Нет |
@IsEmpty
использовать не стоитНе рекомендуется применять:
@IsOptional.Для таких задач существуют другие валидаторы:
@ArrayNotEmpty@IsOptional@IsNotEmpty@IsDefinedimport {
IsEmail,
IsEmpty,
IsString,
MinLength
} from 'class-validator';
export class RegisterDto {
@IsEmail()
email: string;
@IsString()
@MinLength(6)
password: string;
@IsEmpty({
message: 'Поле role заполняется только сервером'
})
role: string;
@IsEmpty()
createdAt: Date;
}
Такой DTO: