ValidationError.target представляет собой исходный
объект, который подвергался валидации. Это одно из ключевых полей
структуры ValidationError, возвращаемой функцией
validate() или validateSync().
При выполнении проверки данных библиотека сохраняет ссылку на оригинальный экземпляр класса или объект, который был передан в процесс валидации. Это позволяет восстановить контекст ошибки и связать каждое нарушение ограничений с конкретной сущностью.
Свойство имеет следующую семантику:
target обычно имеет тип object,
соответствующий валидируемому классу или plain object.
Пример базовой структуры ValidationError:
interface ValidationError {
target?: object;
property: string;
value: any;
constraints?: {
[type: string]: string;
};
children?: ValidationError[];
}
target присутствует только в корневых ошибках. В
дочерних элементах (children) оно часто отсутствует или не
дублируется для экономии памяти и предотвращения избыточного
копирования.
При валидации плоского объекта target содержит полный
входной объект:
import { validate } from "class-validator";
class User {
name: string;
}
const user = new User();
user.name = null;
validate(user).then(errors => {
console.log(errors[0].target);
});
Результатом будет:
User { name: null }
target указывает на исходный экземпляр
User, даже если ошибки связаны только с одним
свойством.
При сложных объектах с вложенными классами target
фиксирует верхнеуровневый объект, а вложенные ошибки переходят в
children.
class Address {
street: string;
}
class User {
address: Address;
}
При ошибке внутри address.street:
target верхнего уровня указывает на
UserValidationError содержит
children, но не всегда дублирует targetПример структуры:
{
target: User { address: Address {} },
property: "address",
children: [
{
property: "street",
value: undefined,
constraints: { isNotEmpty: "street should not be empty" }
}
]
}
Поведение target зависит от опций валидации.
Опция не удаляет target, но может уменьшить количество
ошибок, где он появляется.
validate(user, { skipMissingProperties: true });
target остаётся ссылкой на исходный объект, даже если
часть полей пропущена.
При включении whitelist: true свойства, не имеющие
декораторов, удаляются из объекта.
Это влияет на содержимое target:
validate(user, { whitelist: true });
В этом случае:
target может быть уже модифицированным объектомПри использовании:
validate(user, { whitelist: true, forbidNonWhitelisted: true });
ошибки могут включать target, в котором уже отсутствуют
неразрешённые поля. Это важно учитывать при логировании, так как
исходное состояние частично теряется.
ValidationError.value и
ValidationError.target часто путаются, однако они выполняют
разные функции:
target — весь объект валидацииvalue — конкретное значение свойства, вызвавшего
ошибкуПример:
{
target: User { name: "A", age: 10 },
property: "age",
value: 10
}
target сохраняет контекст всего объекта, тогда как
value локализует проблему.
При использовании вместе с трансформацией объектов (например, через
plainToInstance) target может отражать уже
преобразованную структуру:
const user = plainToInstance(User, plainObject);
validate(user);
В этом случае:
target = экземпляр класса UserПри использовании вложенных классов и декораторов:
target фиксируется только на уровне корневого
объектаchildrenЭто поведение оптимизирует производительность при больших структурах данных.
target используется в следующих сценариях:
Типичный паттерн логирования:
validate(dto).then(errors => {
errors.forEach(err => {
console.log(err.target, err.property, err.constraints);
});
});
При попытке сериализовать ValidationError:
JSON.stringify(errors)
target может:
Это связано с тем, что target может содержать экземпляры
классов с прототипами.
Использование target связано с рядом особенностей:
Эти факторы делают target диагностическим, а не строго
стабильным полем.
target является частью внутреннего механизма трассировки
ошибок:
Такой подход обеспечивает баланс между производительностью и полнотой информации о состоянии данных.