You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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-

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 12:33:27