javascript - 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;
如果这是不可能的,我将不胜感激有关如何实现用于此目的的自定义装饰器的任何指导。
谢谢。
解决方案
考虑这个例子:
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
如果您提供无效的电子邮件域,它将触发运行时错误。如何实现验证逻辑取决于您。运行时错误可能不是必需的
推荐阅读
- javascript - 如何修复 TypeError:navigation.setOptions 不是函数
- file-upload - 使用 Web 应用程序在云服务器上上传文件不起作用
- reactjs - React 17:为什么我必须发送两次 post 请求才能获得有效或错误响应?
- javascript - 如何将此箭头功能解读为传统风格?
- c# - 如何通过 EventTrigger 与另一个控件交互(在 WPF C# 中)
- django - 两台服务器通信时出现 CSRF 错误
- elasticsearch - 管道桶选择器不适用于嵌套对象
- docker - 持久化在 docker 镜像创建期间创建的 conda env
- python - 使用 python 从 selenium 脚本中以 csv、json、mysql/sql、txt 等格式存储抓取的数据
- flutter - Dart for 循环中 print() 的执行次数不正确