使用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
相关产品推荐
相关产品推荐

