npm 包 typesafe-joi 使用教程

阅读时长 6 分钟读完

前言

在进行前端开发过程中,数据校验是一项必不可少的工作。在 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