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

使用class-validator如何校验两个布尔属性不可同时为真或同时为假

实现方案

你可以通过以下两种方式实现x、y值相反的校验规则:


方案1:使用内置@Assert装饰器(最简便)

直接用class-validator提供的断言装饰器写校验表达式即可,不需要自定义逻辑:

import { IsBoolean, Assert } from 'class-validator';

class MyClass {
  @IsBoolean()
  x: boolean;

  @IsBoolean()
  y: boolean;

  // 直接写校验表达式,x和y不相等即符合要求
  @Assert('x !== y', {
    message: 'x和y必须为相反值,不可同时为true或同时为false'
  })
  private readonly xorCheck?: never; // 不需要实际赋值的占位属性
}

方案2:自定义通用类校验装饰器

如果需要在多个类里复用这个异或校验规则,可以封装独立的自定义装饰器:

import { IsBoolean, registerDecorator, ValidationOptions, ValidationArguments } from 'class-validator';

// 定义通用异或校验装饰器,传入两个要校验的字段名
function IsXor(propertyA: string, propertyB: string, validationOptions?: ValidationOptions) {
  return function (target: object) {
    registerDecorator({
      name: 'isXor',
      target: target.constructor,
      propertyName: 'xorCheck',
      constraints: [propertyA, propertyB],
      options: validationOptions,
      validator: {
        validate(_: unknown, args: ValidationArguments) {
          const [propA, propB] = args.constraints;
          const valA = (args.object as Record<string, unknown>)[propA];
          const valB = (args.object as Record<string, unknown>)[propB];
          // 布尔异或核心逻辑:两个值不相等即符合要求
          return valA !== valB;
        },
        defaultMessage(args: ValidationArguments) {
          const [propA, propB] = args.constraints;
          return `${propA}和${propB}必须为相反值,不可同时为true或同时为false`;
        }
      }
    })
  }
}

// 在类上使用自定义装饰器
@IsXor('x', 'y')
class MyClass {
  @IsBoolean()
  x: boolean;

  @IsBoolean()
  y: boolean;
}

说明

两种方案都需要先给x、y加上@IsBoolean()基础校验,避免非布尔值传入时异或判断出现逻辑错误。

内容的提问来源于stack exchange,提问作者lvyecle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:15:02