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

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: 使用 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 来验证我们在应用程序中定义的模式。这些原语可以链接在一起,为您的应用程序构建非常健壮和灵活的模式设计。

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


相关文章
|
6月前
|
编解码 JavaScript 前端开发
TypeScript【第三方声明文件、自定义声明文件、tsconfig.json文件简介、tsconfig.json 文件结构与配置】(六)-全面详解(学习总结---从入门到深化)
TypeScript【第三方声明文件、自定义声明文件、tsconfig.json文件简介、tsconfig.json 文件结构与配置】(六)-全面详解(学习总结---从入门到深化)
335 0
|
1月前
|
JavaScript 前端开发
Vue2整合TypeScript:借助vue-property-decorator以类模式编写组件
Vue2整合TypeScript:借助vue-property-decorator以类模式编写组件
138 3
|
3月前
|
JavaScript 前端开发 安全
TypeScript:解锁JavaScript的超级英雄模式!类型系统如何化身守护神,拯救你的代码免于崩溃与混乱,戏剧性变革开发体验!
【8月更文挑战第22天】TypeScript作为JavaScript的超集,引入了强大的类型系统,提升了编程的安全性和效率。本文通过案例展示TypeScript如何增强JavaScript:1) 显式类型声明确保函数参数与返回值的准确性;2) 接口和类加强类型检查,保证对象结构符合预期;3) 泛型编程提高代码复用性和灵活性。这些特性共同推动了前端开发的标准化和规模化。
59 0
|
6月前
|
JavaScript 前端开发 IDE
【JavaScript与TypeScript技术专栏】JavaScript与TypeScript混合编程模式探讨
【4月更文挑战第30天】本文探讨了在前端开发中JavaScript与TypeScript的混合编程模式。TypeScript作为JavaScript的超集,提供静态类型检查等增强功能,但完全切换往往不现实。混合模式允许逐步迁移,保持项目稳定性,同时利用TypeScript的优点。通过文件扩展名约定、类型声明文件和逐步迁移策略,团队可以有效结合两者。团队协作与沟通在此模式下至关重要,确保代码质量与项目维护性。
149 0
|
6月前
|
小程序 IDE JavaScript
【社区每周】IDE推出3.0Beta版本,支持TypeScript + Less 研发模式(2022年5月第二期)
【社区每周】IDE推出3.0Beta版本,支持TypeScript + Less 研发模式(2022年5月第二期)
60 0
|
设计模式 前端开发 JavaScript
使用 React 和 TypeScript something 编写干净代码的10个必知模式
JavaScript 是一种松散的类型化语言,因此,它捕获了运行时。这样做的结果就是 JavaScript 错误被捕获得非常晚,这可能导致严重的 bug。
101 0
|
设计模式 消息中间件 JavaScript
图解设计模式之发布-订阅模式(TypeScript)上
图解设计模式之发布-订阅模式(TypeScript)上
477 0
|
设计模式 JavaScript C++
图解设计模式之发布-订阅模式(TypeScript)下
图解设计模式之发布-订阅模式(TypeScript)下
218 0
|
JavaScript 前端开发 开发者
TypeScript + Vue 传统多页面开发模式配置方案
这种开发方式很非主流,但我确实有这种需求。Vue 适合用来开发 SPA 单页应用,所以连官方文档和网络上的各种资料、问答也都是适合用于单页应用的项目配置。 我也是最近因为种种原因才开始接触 Vue,发现对于网页中需要有大量数据变动和组件联动情况下,Vue 还是比较方便的。
3965 0
|
资源调度 前端开发 JavaScript
下一篇
无影云桌面