使用 Zod 在 TypeScript 中进行自定义模式验证

简介: 使用 Zod 在 TypeScript 中进行自定义模式验证

Zod是一个模式验证库。它最适合构建 Typescript 项目。Zod 具有零依赖性,这意味着您可以在没有任何其他库的情况下安装和使用 Zod,并且它将帮助您保持捆绑包的体积更小。

在本文中,我们将介绍如何使用 Zod 将基本的自定义验证逻辑用于模式解析验证。这将仅涵盖在您创建的模式中添加自定义验证逻辑的一些基本方法。

为什么需要模式验证?

模式验证是将数据结构验证为一组预定义的模式规范的过程。我们可以使用它来确保输入数据的有效性,以及记录和实施您的应用程序的数据结构。

由于以下原因,我们可能主要需要向我们的应用程序添加解析库

  • 在发送到服务器之前解析表单数据
  • 在发送回客户端之前解析数据
  • 在我们的应用程序周围的函数中解析数据
  • 在发送到数据库之前在 API 边界解析数据
  • 解析来自第三方数据源的数据

Zod 使创建简单模式以验证基元、对象、从模式推断类型、组合模式等变得非常容易。

安装中

我们将使用以下命令启动一个准系统项目。

mkdir zod-custom-validation
cd zod-custom-validation
npm init -y
npm i zod
npm i tsx --save-dev
复制代码

在我们安装了所有需要的包以开始 typescript 编译之后,我们需要将其调整到我们的package.json文件中

"scripts": {
    "validation": "tsx watch validation.ts"
  }
复制代码

在这里,我们指定我们将运行一个文件名validation.ts,我们将创建它来试验 zod 验证。

让我们使用以下命令在我们的根文件夹中创建一个 validation.ts 文件

touch validaton.ts
npm run validaton
复制代码

基本验证

要从基本验证开始,我们可以从拥有用户字段开始。这会像

  • id 将是一种数字
  • 名称将是一个字符串
  • 投资组合将是一个字符串,应该是一个 url
  • 薪水将是一个数字并且可以为空/可选
import z from 'zod';
const schema = z.object({
  id: z.string({
    required_error: "ID is required",
    invalid_type_error: "ID must be a string"
  }),
  name: z.string({
    required_error: "Name is required",
    invalid_type_error: "Name must be a string"
  }),
  portfolio: z.string({
    required_error: "portfolio is required",
    invalid_type_error: "portfolio must be a string"
  }).url(),
  salary: z.number({
    invalid_type_error: "salary must be a number"
  }).optional(),
})
type ValidatePayload = z.infer<typeof schema>
const payload: ValidatePayload = {
  id: "35625",
  name: "New user",
  portfolio: "https://dev.to/isnan__h/custom-schema-validation-in-typescript-with-zod-5cp5"
}
const parseSchema = (props: ValidatePayload) => {
  return schema.parse(props)
}
const result = parseSchema(payload)
console.log(JSON.stringify(result))
复制代码

在上面的代码片段中,我们定义了一个带有一组规则的模式。必须传递这些规则才能无错误地执行我们的验证。

要检查这一点,我们可以传递一个不是 URL 的 url,然后它将失败并出现错误,需要 portfolio 是一个 URL。

自定义验证

要添加自定义验证,可以使用提供给我们的方法 .superRefine() 来实现,我们有 .refine() 方法,refine 方法用于通过优化提供自定义验证逻辑。

const schema = z.object({
  name: z.string({
    required_error: "Name is required",
    invalid_type_error: "Name must be a string"
  }),
  phone: z.number({
    required_error: "Phone number is required",
    invalid_type_error: "Phone must be a number"
  }),
  confirmPhone: z.number({})
}) .refine((data) => data.phone === data.confirmPhone, {
  message: "Phone numbers dont match"
});
const payload: ValidatePayload = {
  name: "New user",
  phone: 24562454453465,
  confirmPhone: 24562454453465
}
const result = parseSchema(payload)
console.log(JSON.stringify(result))
复制代码

这是我们如何使用 refine() 方法添加自定义逻辑的基本实现。在上面的示例中,我们确保 phone 和 confirmPhone 需要相同。

结论

我们可以使用 Zod 来验证我们在应用程序中定义的模式。这些原语可以链接在一起,为您的应用程序构建非常健壮和灵活的模式设计。

运行时验证始终是我们应用程序所必需的,因为它使我们的代码更具可读性,并在将用户输入重定向到服务器之前对其进行清理。


相关文章
|
3月前
|
编解码 JavaScript 前端开发
TypeScript【第三方声明文件、自定义声明文件、tsconfig.json文件简介、tsconfig.json 文件结构与配置】(六)-全面详解(学习总结---从入门到深化)
TypeScript【第三方声明文件、自定义声明文件、tsconfig.json文件简介、tsconfig.json 文件结构与配置】(六)-全面详解(学习总结---从入门到深化)
65 0
|
3月前
|
小程序 IDE JavaScript
【社区每周】IDE推出3.0Beta版本,支持TypeScript + Less 研发模式(2022年5月第二期)
【社区每周】IDE推出3.0Beta版本,支持TypeScript + Less 研发模式(2022年5月第二期)
30 0
|
设计模式 前端开发 JavaScript
使用 React 和 TypeScript something 编写干净代码的10个必知模式
JavaScript 是一种松散的类型化语言,因此,它捕获了运行时。这样做的结果就是 JavaScript 错误被捕获得非常晚,这可能导致严重的 bug。
83 0
|
设计模式 JavaScript C++
图解设计模式之发布-订阅模式(TypeScript)下
图解设计模式之发布-订阅模式(TypeScript)下
170 0
|
设计模式 消息中间件 JavaScript
图解设计模式之发布-订阅模式(TypeScript)上
图解设计模式之发布-订阅模式(TypeScript)上
410 0
|
JavaScript
TypeScript reflect-metadata 结合方法装饰器实现的一个自定义语法检查的例子
TypeScript reflect-metadata 结合方法装饰器实现的一个自定义语法检查的例子
TypeScript reflect-metadata 结合方法装饰器实现的一个自定义语法检查的例子
|
JavaScript
使用 TypeScript 自定义装饰器给类的属性增添监听器 Listener
使用 TypeScript 自定义装饰器给类的属性增添监听器 Listener
110 0
使用 TypeScript 自定义装饰器给类的属性增添监听器 Listener
|
JavaScript
TypeScript里对数组元素的自定义属性排序的实现原理
TypeScript里对数组元素的自定义属性排序的实现原理
76 0
TypeScript里对数组元素的自定义属性排序的实现原理
|
JavaScript API
使用 TypeScript 自定义装饰器给类的属性增添监听器 Listener
使用 TypeScript 自定义装饰器给类的属性增添监听器 Listener
298 0
使用 TypeScript 自定义装饰器给类的属性增添监听器 Listener
|
JavaScript 编译器 API
TypeScript reflect-metadata 结合方法装饰器实现的一个自定义语法检查的例子
TypeScript reflect-metadata 结合方法装饰器实现的一个自定义语法检查的例子
136 0
TypeScript reflect-metadata 结合方法装饰器实现的一个自定义语法检查的例子