前言
在进行前端开发过程中,数据校验是一项必不可少的工作。在 JavaScript 语言中,Joi 已经成为了一个非常不错的数据校验库,可以帮助我们快速的完成常用的数据验证操作。
但是,由于 JavaScript 的动态特性,Joi 在一些特殊情况下可能会出现类型不一致错误的问题,导致验校失败。为了解决这个问题,众多开发者陆续开发了支持类型安全的 Joi 包,其中 typesafe-joi 是一个非常不错的选择。
本篇文章将为大家分享 typesafe-joi 的使用教程,详细介绍这个包的优势以及注意点,带大家一起来体验它的强大功能。
基本用法
typesafe-joi 提供了和 Joi 几乎一样的 API 接口,同时又加入了类型安全的特性。在使用 typesafe-joi 的时候,我们可以先定义一个 schema,然后对这个 schema 进行校验。
下面是一个简单的样例,演示了如何使用 typesafe-joi 进行字符串类型校验:
-- -------------------- ---- ------- ------ --- ---- ------ ------ - ------ - ---- ------ ------ - ------ - ---- --------------- ----- ---------- - -------- ----- -------------------- --- ------------ ----- ---------- -- ------------ -- ------- --------- ------------ ----- - -- ------------ -- ------------------------- ------ ---- -- - ------
在这个例子中,我们首先引入了 Joi、string 这两个库中的 API。然后创建了一个 nameSchema,其中指定了 name 字段必须为字符串类型并且不能为空。
接下来,我们对 { name: 'zhangsan' } 和 { name: 1 } 进行了数据校验,并使用 Joi 的 assert 函数进行输出。对于名字为字符串类型的数据,该函数直接输出 undefined;而对于名字类型错误的数据,该函数将抛出“必须为字符串”的异常。
类型安全
上面我们提到了 typesafe-joi 的一个重要特性:它支持类型安全。那么这个特性在实际使用中具体表现为什么呢?
其实,在使用 typesafe-joi 进行数据校验时,我们可以使用 TypeScript 对校验规则进行定义,这样一来就可以在编译期间就发现校验规则出现的类型安全问题了。
假设一个场景,我们使用 Joi 对一个名字为“name”的字段进行数据校验,但在程序中我们却将其写成了“names”,由于 Joi 是一个动态类型的库,它在运行时是不会对该问题做出任何提示的。
而如果使用 typesafe-joi 进行校验,我们就可以在编译阶段就发现该问题,从而提高了代码的健壮性和安全性。下面我们来看一个例子。
-- -------------------- ---- ------- ------ - ------ - ---- ------ ------ - ------ - ---- --------------- --------- ------ - ----- ------- ---- ------- - ----- ----------- - -------- ------ -------------------- ---- -------------------- --- ----- ----------- - -------- ----- -------------------- ---- -------------------- --- -- ------------ ------ -- ----- ------- ------ - - ------ -------- ---- --- -- -- ------------------ ------- ---- --- ----- -- ---- -------- -- ------------------ ------------- -- ----------- ------------------ -------------
在这个例子中,我们首先定义了一个类型为 Person 的接口,其中包含姓名和年龄两个字段。然后创建了两个数据校验规则:
- schemaWrong:规定姓名必须为“names”,年龄必须为字符串类型。
- schemaRight:规定姓名必须为“name”,年龄必须为字符串类型。
接下来我们定义了一个 person 变量,其属性名称分别为“names”和“age”,并且将它赋值给了 Person 接口。显然这个数据结构是不符合规范的,而使用 typesafe-joi 进行校验并传入 schemaWrong 进行编译时,TypeScript 会报出“Person 中不存在 names 属性”的错误;而使用 schemaRight 进行编译后,则不会报错,运行起来也不会出现校验错误。
强制验证
Joi 是一个非常灵活的库,我们可以不对数据进行严格的验证,允许一些不满足校验规则的数据存在。而对于 typesafe-joi,我们则允许开发者对校验规则进行强制验证。
对于强制验证的规则,只要设置 strict: true 即可。该规则将在校验失败时抛出一个错误,而不是将错误存储在 ValidationError 对象中。举个例子:
-- -------------------- ---- ------- ------ - ------ - ---- ------ ------ - ------ - ---- --------------- ----- ------------ - ------- - ----- ---------------------- -- - ------- ---- - -- ----- --------------- - ------- - ----- ----------------------- -- - ------- ----- - -- -- --------------------- ------ -- --- ------- -- ----------------- -------- ---- ---- -------------- -- -- --------- ------------ ----- -------- ---- -- -- -----------------
在这个例子中,在 strictSchema 中,我们将 strict 属性设置为 true,这意味着在对 {name: 'Lucas', age: 25} 进行校验时,必须确保该数据中仅仅包含了 name 字段,否则将抛出一个错误。
相反,在 nonStrictSchema 中,我们将 strict 属性设置为 false,这意味着可以向该 schema 中添加任意的数据元素,而不必进行过多的验证。当 {name: 'Lucas', age: 25} 传入数据块时,它能够通过验证并输出 undefined。
总结
本文为大家介绍了 typesafe-joi 的使用方法,该包能够在 Joi 的基础上,增加了对于类型安全的支持,并允许开发人员在编译阶段就发现可能存在的数据校验问题。
我们通过样例代码,详细的讲解了 typesafe-joi 如何进行数据校验、如何支持强制校验规则以及如何利用 TypeScript 检查校验规则的类型安全。希望这篇文章对大家在前端开发中能够充分利用 typesafe-joi 提高开发效率提供帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/typesafe-joi