我有这门课
class A {
@IsString()
@MaxLength(99)
prop1: string
@IsBoolean()
prop2: boolean
}
我希望它是:
在类验证器中,有
@ValidateIf()
class A {
@IsString()
@MaxLength(99)
@ValidateIf((obj) => obj.prop2)
prop1: string
@IsBoolean()
prop2: boolean
}
确实,当 prop2 为
ValidateIf()
时,false
将使 prop1 成为可选。但它会禁用我对 @MaxLength()
和 @IsString()
的检查。现在你可以传递一个号码了!那不是我想要的。我只是希望它是可选的。
我在想,有没有办法说
@IsRequiredIf()
或@IsOptionalIf()
而不是说@ValidateIf()
?
我创建了自己的
IsOptionalIf()
装饰器:
import { type ValidationMetadataArgs } from 'class-validator/types/metadata/ValidationMetadataArgs'
import { type ValidationOptions, ValidationTypes, getMetadataStorage } from 'class-validator'
import { ValidationMetadata } from 'class-validator/cjs/metadata/ValidationMetadata'
export const IS_OPTIONAL_IF = 'isOptionalIf'
export function IsOptionalIf(
condition: (object: any, value: any) => boolean,
validationOptions?: ValidationOptions
): PropertyDecorator {
return function (object: object, propertyName: string): void {
const args: ValidationMetadataArgs = {
type: ValidationTypes.CONDITIONAL_VALIDATION,
name: IS_OPTIONAL_IF,
target: object.constructor,
propertyName: propertyName,
constraints: [
(object: any, value: any): boolean => {
const performValidation = condition(object, value)
if (!performValidation) return true
else return object[propertyName] !== null && object[propertyName] !== undefined
},
],
validationOptions: validationOptions,
}
getMetadataStorage().addValidationMetadata(new ValidationMetadata(args))
}
}