在前端开发过程中,有很多场景需要定义数据结构,例如接口请求参数,响应结果等等,而手动编写这些数据结构很麻烦,容易出错。此时,typebox 以及它的相关 npm 包就能够解决这些问题,它们能够帮助我们快速定义数据结构和进行序列化、反序列化操作。
typebox 简介
typebox 是一个基于 TypeScript 的库,它提供了一种简便的方式来定义运行时类型。所有定义的类型都会被编译成 JSON Schema,因此我们不需要手动创建这些类型,也不需要对它们进行手动维护。
typebox 安装
我们可以利用 npm 包管理工具,使用如下命令安装 typebox。
npm i typebox
typebox 使用
typebox 的使用方式很灵活,我们可以利用它定义接口参数、返回数据等等,下面我们来看一些实际的使用场景。
定义数据结构
我们可以使用 typebox 定义一个简单用户结构,具体如下:
import { Type } from 'typebox'; const User = Type.Object({ id: Type.Number(), name: Type.String(), age: Type.Number(), gender: Type.String(), })
上述代码使用 Type.Object
定义了一个对象,包含 id
、name
、age
和 gender
4 个属性,每个属性分别用 Type.Number
和 Type.String
定义了数据类型。
typebox 还支持枚举类型的定义,例如:
-- -------------------- ---- ------- ------ - ---- - ---- ---------- ---- ------ - ---- - ------- ------ - --------- - ----- ---- - ------------- --- -------------- ----- -------------- ---- -------------- ------- ------------------ --
上述代码在之前定义的 User
对象中,新增了一个 gender
属性,它的类型是枚举类型 Gender
。
序列化和反序列化
类型定义完成之后,我们可以使用 typebox 提供的方法进行序列化和反序列化操作,例如:
-- -------------------- ---- ------- ------ - ----- --- --- - ---- ---------- --------- ---- - --- ------- ----- ------- ---- ------- ------- ------- - ---- ------ - ---- - ------- ------ - --------- - ----- ---------- - ------------- --- -------------- ----- -------------- ---- -------------- ------- ------------------ -- ----- ----- ---- - - --- -- ----- ------ ---- --- ------- ------------ - ----- ---------- - --------------------------- ------------------------ -- ---------------------------------------------- ----- ------------ - -------------------------------- -- ------------------ - -------------------------------- -- - --- -- ----- ------ ---- --- ------- ------ - - ---- - -------------------------------- -
上述代码中,我们定义了一个 JavaScript 对象 data
,包含 id
、name
、age
和 gender
4 个属性,它们的数据类型分别与之前定义的 typebox 对象 UserSchema
中的对应属性类型保持一致。接着,我们利用 UserSchema.serialize
方法将 JavaScript 对象序列化成 JSON 字符串,并输出到控制台。最后,我们将这个 JSON 字符串进行反序列化,得到一个 JavaScript 对象,并输出到控制台。
与 koa 结合使用
typebox 进一步提供了与 koa 结合使用的方式。我们在中间件中使用它,可以根据 JSON Schema 来自动验证 request body 这一过程,代码如下:
-- -------------------- ---- ------- ------ --- ---- ------ ------ ------ ---- ------------- ------ - ----- -- - ---- ---------- --------- -------- - ----- ------- ---- ------- - ----- ------ - --- --------- ------------------------- ----- ----- -- - ----- ------ - ------------- ----- -------------- ---- -------------- --- ----- ---------------- - ---------------------------------- -- ---------------------- - ----- --------- -------- - ----------------------- ---------------------- ---------- - ---- -------- - ----- - ---- - ---------- - ---- -------- - ---- --------- - --- ----- --- - --- ------ ----------------------------- ---------- ---- ---- ------------------------- ---------------- -- -- - ------------------- ------- -- ---- ------- ---
本代码对应的功能是:用户 POST /user/info
接口去传递请求体为 { name: 'aaa', age: 20 }
的请求。如果请求体符合定义好的 JSON schema,则 server 会将解析出来的数据输出到控制台,反之则返回 Bad Request。
总结
本文简单介绍了 typebox 的使用方法,包括如何定义数据结构、如何进行数据序列化和反序列化以及如何在 koa 中使用。通过使用 typebox,我们可以快速、准确地定义数据结构,并且避免手写类型定义时出现的错误。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60055ac381e8991b448d85c6