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 来验证我们在应用程序中定义的模式。这些原语可以链接在一起,为您的应用程序构建非常健壮和灵活的模式设计。
运行时验证始终是我们应用程序所必需的,因为它使我们的代码更具可读性,并在将用户输入重定向到服务器之前对其进行清理。