Вы ожидаете, что positions: [1]
выдаст 400, но вместо этого он принят.
Согласно этой проблеме Github , это похоже на ошибку в классе-валидаторе.Если вы передадите примитивный тип (boolean
, string
, number
, ...) или array
вместо объекта, он примет входные данные как допустимые, хотя и не должен.
Я не вижу никакого стандартного обходного пути, кроме создания настраиваемого декоратора проверки правильности :
import { registerDecorator, ValidationOptions, ValidationArguments } from 'class-validator';
export function IsNonPrimitiveArray(validationOptions?: ValidationOptions) {
return (object: any, propertyName: string) => {
registerDecorator({
name: 'IsNonPrimitiveArray',
target: object.constructor,
propertyName,
constraints: [],
options: validationOptions,
validator: {
validate(value: any, args: ValidationArguments) {
return Array.isArray(value) && value.reduce((a, b) => a && typeof b === 'object' && !Array.isArray(b), true);
},
},
});
};
}
и последующего использования в вашем классе dto:
@ValidateNested({ each: true })
@IsNonPrimitiveArray()
@Type(() => PositionDto)
positions: PositionDto[];