首页 > 解决方案 > Typescript Class-Validator 包含多个字符串 (IsEmail)

问题描述

我一直在使用 class-validator 装饰器库来验证 dto 对象,并希望为 @IsEmail 装饰器创建域白名单。该库包含一个 @Contains 装饰器,可用于单个字符串(种子),但我想输入一个有效字符串数组。这可能吗?

当前的

  @Contains('@mydomain.com')
  @IsEmail()
  public email: string;

想要的

  @Contains(['@mydomain, @yourdomain, @wealldomain, @fordomain'])
  @IsEmail()
  public email: string;

如果这是不可能的,我将不胜感激有关如何实现用于此目的的自定义装饰器的任何指导。

谢谢。

标签: javascripttypescriptclass-validatortypescript-decorator

解决方案


考虑这个例子:

const Contains = <Domain extends `@${string}`, Domains extends Domain[]>(domains: [...Domains]) =>
    (target: Object, propertyKey: string) => {
        let value: string;
        const getter = () => value
        const setter = function (newVal: Domain) {
            if (domains.includes(newVal)) {
                value = newVal;
            }
            else {
                throw Error(`Domain should be one of ${domains.join()}`)
            }
        };
        Object.defineProperty(target, propertyKey, {
            get: getter,
            set: setter
        });
    }

class Greeter {
    @Contains(['@mydomain', '@wealldomain'])
    greeting: string;
    constructor(message: string) {
        this.greeting = message;
    }

}

const ok = new Greeter('@mydomain'); // ok
const error = new Greeter('234'); // runtime error

操场

如果您提供无效的电子邮件域,它将触发运行时错误。如何实现验证逻辑取决于您。运行时错误可能不是必需的


推荐阅读