【nestjs】解决class-validator的联合类型验证问题

567 阅读1分钟

在学习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'],验证逻辑内置到自定义装饰器中,专门用来验证基础类型的联合类型,这样的装饰器职能比较单一且内聚;