我一直在使用类验证器装饰器库来验证dto对象,并想为@IsEmail装饰器创建一个域白名单。该库包含一个@Contains装饰器,它可以用于单个字符串(种子),但我想输入一个有效字符串数组。这可能吗?
目前
@Contains('@mydomain.com')
@IsEmail()
public email: string;
的
@Contains(['@mydomain, @yourdomain, @wealldomain, @fordomain'])
@IsEmail()
public email: string;
如果这是不可能的,我将感激任何关于如何实现自定义装饰器来达到这个目的的指导。
谢谢。
考虑这个例子:
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
游乐场
如果您提供无效的电子邮件域,将触发运行时错误。这取决于您希望如何实现验证逻辑。可能没有必要出现运行时错误