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

如何向自定义Validator传递参数?以前缀数组校验为例

如何将前缀字符串数组传入自定义校验器并访问参数?

你可以通过以下两种方式实现需求:

方式一:直接使用@Validate传递参数

1. 修改校验器逻辑,从ValidationArguments获取参数

在校验器的validate方法中,通过validationArguments.constraints获取传入的前缀数组:

import { ValidatorConstraint, ValidatorConstraintInterface, ValidationArguments } from 'class-validator';

@ValidatorConstraint({ name: 'prefixValidator' })
class PrefixValidator implements ValidatorConstraintInterface {
  validate(value: string, validationArguments?: ValidationArguments): boolean {
    // 提取传入的前缀数组
    const prefixes = validationArguments?.constraints[0] as string[];
    
    // 处理空前缀的边界情况
    if (!prefixes || prefixes.length === 0) {
      return false; // 或根据业务需求返回true
    }

    return prefixes.some(prefix => value.startsWith(prefix));
  }

  // 可选:自定义错误提示消息
  defaultMessage(validationArguments?: ValidationArguments): string {
    const prefixList = validationArguments?.constraints[0].join(', ');
    return `字符串必须以 ${prefixList} 中的某个前缀开头`;
  }
}

2. 在DTO中传递前缀数组

在@Validate装饰器的第二个参数中传入前缀数组:

import { Validate } from 'class-validator';

class DTO {
  @Validate(PrefixValidator, [['foo', 'bar', 'baz']]) // 传入前缀数组作为约束参数
  myString: string;
}

方式二:自定义装饰器(更优雅的使用方式)

如果需要频繁使用该校验,可以封装成自定义装饰器,简化调用:

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

@ValidatorConstraint({ name: 'prefix' })
class PrefixValidator implements ValidatorConstraintInterface {
  validate(value: string, args: ValidationArguments) {
    const prefixes = args.constraints[0];
    return prefixes.some(prefix => value.startsWith(prefix));
  }

  defaultMessage(args: ValidationArguments) {
    return `输入内容必须以 ${args.constraints[0].join(', ')} 中的某个前缀开头`;
  }
}

// 封装自定义装饰器
function Prefix(prefixes: string[], validationOptions?: ValidationOptions) {
  return function (object: Object, propertyName: string) {
    registerDecorator({
      target: object.constructor,
      propertyName: propertyName,
      options: validationOptions,
      constraints: [prefixes],
      validator: PrefixValidator,
    });
  };
}

// 使用自定义装饰器
class DTO {
  @Prefix(['foo', 'bar']) // 直接传入前缀数组
  myString: string;
}

核心原理

ValidationArguments对象的constraints属性会存储我们在装饰器中传入的所有额外参数,通过索引即可取出对应的前缀数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 05:10:30