Декораторы в системе валидации class-validator представляют собой декларативный механизм описания правил проверки данных непосредственно в структуре классов. Такой подход изменяет саму модель разработки: вместо императивного описания логики валидации в отдельных функциях правила становятся частью описания модели данных.
Использование декораторов позволяет переносить правила валидации из процедурного кода в описание сущностей. Это создаёт принципиально иной уровень абстракции.
Ключевой эффект:
Пример базового применения:
import { IsString, IsNotEmpty, IsInt, Min, Max } from "class-validator";
class User {
@IsString()
@IsNotEmpty()
username;
@IsInt()
@Min(0)
@Max(120)
age;
}
В этом подходе сама модель данных становится самодокументируемой: каждое поле содержит описание допустимых значений.
Декораторы работают через систему метаданных TypeScript и Reflect API. При объявлении декоратора не происходит немедленной валидации — вместо этого сохраняется описание правил, которое используется позже при вызове функций проверки.
Такой механизм обеспечивает несколько важных свойств:
Отложенное выполнение
Расширяемость
Интроспекция
Декораторы формируют чёткое разделение между моделью данных и логикой обработки. Это особенно важно в архитектурах, где присутствует несколько уровней: контроллеры, сервисы, DTO и доменные сущности.
Преимущества разделения:
В типичной архитектуре:
class CreateUserDto {
@IsString()
@Length(3, 20)
name;
@IsEmail()
email;
}
Контроллер или сервис работает уже с гарантированно структурированными данными.
Декораторы позволяют комбинировать множество ограничений для одного поля без усложнения кода. Каждое правило представляет собой независимый слой проверки.
@IsString()
@IsNotEmpty()
@Matches(/^[a-zA-Z0-9]+$/)
username;
Композиционный подход даёт следующие свойства:
Декораторы могут применяться не только к отдельным полям, но и к целым классам, включая вложенные структуры. Это позволяет строить масштабируемые модели данных.
class Address {
@IsString()
city;
@IsString()
country;
}
class User {
@ValidateNested()
address;
}
Такой подход позволяет:
Декораторы заменяют отдельные схемы валидации и внешние описания структуры данных. Код класса становится источником правды о структуре объекта.
Эффект читаемости:
Это особенно важно в больших проектах, где количество DTO и моделей может быть значительным.
Декораторы валидации часто используются совместно с преобразованием объектов, где входные данные приводятся к экземплярам классов. Такой подход усиливает контроль над структурой данных.
Схема работы:
Это создаёт единый поток обработки данных, где валидация становится встроенным этапом конвейера.
Без декораторов валидация часто реализуется в виде повторяющихся проверок в разных частях приложения. Декларативный подход устраняет этот слой дублирования.
Пример проблемного подхода:
if (typeof username !== "string") throw new Error();
if (username.length === 0) throw new Error();
С декораторами:
@IsString()
@IsNotEmpty()
username;
Логика становится централизованной и переиспользуемой.
Архитектура декораторов позволяет создавать собственные валидаторы, которые интегрируются в общую систему без изменения ядра библиотеки.
Пример пользовательского декоратора:
import { registerDecorator } from "class-validator";
function IsEven() {
return function (object, propertyName) {
registerDecorator({
name: "isEven",
target: object.constructor,
propertyName,
validator: {
validate(value) {
return typeof value === "number" && value % 2 === 0;
}
}
});
};
}
Такой механизм обеспечивает:
При проектировании доменных систем часто требуется описывать сложные взаимосвязи между объектами. Декораторы позволяют выразить эти связи прямо в модели данных.
class Order {
@ValidateNested()
items;
@IsInt()
totalPrice;
}
Это делает модель ближе к предметной области, а не к технической реализации.
Использование декораторов обеспечивает единообразие правил в разных частях системы. Независимо от того, где создаётся объект — в контроллере, сервисе или тестах — правила остаются одинаковыми.
Это устраняет класс проблем:
Декораторы формируют единый источник правил для всей системы обработки данных.