class-validator中如何实现条件必填/可选且保留原有校验?
class-validator 实现条件必填且保留格式校验
你的需求是让prop1在prop2为true时必填,为false时可选,但无论是否必填,只要传入prop1就必须满足字符串类型和最大长度99的校验。之前使用@ValidateIf()的问题在于,这个装饰器会让所有字段校验仅在条件成立时执行,导致prop2为false时,@IsString()和@MaxLength()也被跳过,不符合预期。
可以直接用@IsRequiredIf()或@IsOptionalIf()来替代,这两个装饰器只会控制字段的必填/可选状态,不会影响其他校验规则的执行:
方案一:使用@IsRequiredIf()
class A { @IsString() @MaxLength(99) @IsRequiredIf((obj) => obj.prop2) // 仅当prop2为true时要求prop1必填 prop1?: string; // TS类型标记为可选,对应prop2为false时的可选场景 @IsBoolean() prop2: boolean; }
方案二:使用@IsOptionalIf()
class A { @IsString() @MaxLength(99) @IsOptionalIf((obj) => !obj.prop2) // 当prop2为false时,prop1变为可选 prop1?: string; @IsBoolean() prop2: boolean; }
效果说明
- 当
prop2为true时:prop1必须传入,且必须是长度≤99的字符串,否则校验失败。 - 当
prop2为false时:prop1可以不传;如果传入了,必须是长度≤99的字符串,否则校验失败。
内容的提问来源于stack exchange,提问作者Islam Y-
相关产品推荐
相关产品推荐

