在学习nestjs的路途中遇到了一个不大不小的弯道,在DTO中使用class-validator校验联合类型问题!google了一下,没有找到简单合适的解决方案,无奈只能认真翻阅github文档,花了些时间最终解决;望新入坑的小伙伴减少弯道,节约时间,快速追赶超车,特此分享😄!
解决思路(github文档: Custom validation decorators )
自定义动态验证装饰器: dynamic.validator.ts
import { registerDecorator, ValidationOptions } from 'class-validator';
// 动态验证器;通过回调函数验证
export function DynamicValidator(
validator: (value: any) => boolean,
validationOptions?: ValidationOptions,
return function (object: object, propertyName: string) {
registerDecorator({
name: 'DynamicValidator',
target: object.constructor,
propertyName: propertyName,
options: validationOptions,
validator: {
validate: validator,
在dto中使用:login.dto.ts
import { IsString, isEmail, isMobilePhone } from 'class-validator';
import { DynamicValidator } from '@/validators/dynamic.validator';
export class LoginDto {
*用户名:手机号/邮箱
*@example
@IsString()
@DynamicValidator(
(value) => isMobilePhone(value, 'zh-CN') || isEmail(value),
message: '手机号/邮箱',
username: string;
@IsString()
password: string;
我这里是使用这种回调验证的方式解决联合类型问题(自己的项目,比较随意,灵活为主)!
但是,按照自定义验证装饰器的思路,可以根据自己的需求定制进行封装,不一定非要使用回调函数;比如:可以通过传入基础类型数组['string', 'number', 'boolean'],验证逻辑内置到自定义装饰器中,专门用来验证基础类型的联合类型,这样的装饰器职能比较单一且内聚;