概述
在 TypeScript 中使用类时,为了保证数据的正确性、安全性,我们常常需要进行属性验证。这时候 npm 包 typescript-class-validator 就提供了便利。该包是一个基于装饰器的 TypeScript 类属性验证器,允许使用简洁的装饰器语法声明类及其属性的验证规则,并在属性赋值时自动进行验证。
在本文中,我们将学习如何使用 typescript-class-validator 包来实现 TypeScript 类属性的验证。
安装
使用以下命令进行安装:
npm install class-validator reflect-metadata --save
其中 reflect-metadata 是必须的,这是因为 typescript-class-validator 包内部使用了 TypeScript 的装饰器特性,需要借助 reflect-metadata 来支持。
验证装饰器
使用 typescript-class-validator 包,我们需要在类属性上使用装饰器来声明验证规则。这些装饰器统称为“验证装饰器”,可在包的 Validator 模块中找到。
以下是一些常用的验证装饰器:
装饰器 | 用途 |
---|---|
IsNotEmpty | 校验字符串、数组、类数组非空 |
IsBoolean | 校验布尔值类型 |
IsNumber | 校验数值类型 |
IsInt | 校验整数类型 |
IsString | 校验字符串类型 |
IsEmail | 校验电子邮件格式 |
IsUrl | 校验 URL 格式 |
IsEnum | 校验枚举值是否合法 |
MinLength | 校验字符串、数组、类数组最小长度 |
MaxLength | 校验字符串、数组、类数组最大长度 |
Min | 校验数值最小值 |
Max | 校验数值最大值 |
MinDate | 校验日期最早时间 |
MaxDate | 校验日期最晚时间 |
具体使用方法,请见下一节例子。
使用
以下是一个使用 typescript-class-validator 的示例:
-- -------------------- ---- ------- ------ ------------ ------ ---- ---- ------------------ ----- ----- - ------------- ---------- ------- -------- ------- --------- ------- ---------------------- ------- --------- ------- - -------------- - ---------- ------------- - --------- - ----------- ------ - -- ------ - - ----- ----- - --- --------- --- ----- ------ - ----- ---------------- --------------------
我们创建了一个名为 Order 的类,它有两个必须的属性,分别是 productId 和 quantity。我们使用 IsNotEmpty 和 IsInt 装饰器来分别验证这两个属性。
在实例化 Order 类之后,我们使用 validate 函数进行验证。validate 函数是 typescript-class-validator 包的内置验证函数,它返回一个 Promise 对象并尝试验证传入的类实例。如果类实例验证通过,Promise 的状态会被设置为 resolved,否则会被设置为 rejected。在 Promise 的 resolved 或 rejected 事件中,我们可以处理成功或失败时需要进行的操作。
在本例中,我们将验证的错误记录在一个 errors 数组中,并输出到控制台。
其它验证方法
除了使用装饰器声明验证规则之外,typescript-class-validator 还提供了其它的验证方法。以下是一些常见的验证方法:
方法名 | 作用 |
---|---|
validateSync(obj) | 同步验证一个类实例 |
validate(obj) | 异步验证一个类实例 |
validateOrReject(obj) | 如果验证不通过,则异步抛出一个 ValidationError 异常 |
validateOrRejectSync(obj) | 同步验证一个类实例,否则抛出 ValidationError 异常 |
结论
typescript-class-validator 这个 npm 包为 TypeScript 类属性验证提供了非常方便、简洁、强大的方式。利用它可以轻松声明并检验属性值的完整性。同时,与它的其它优点相比,写代码的难度不算大并且可读性良好。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60067359890c4f7277583e4c