Zod进行TypeScript类型验证使用详解

Zod进行TypeScript类型验证使用详解

目录

引言

什么是类型验证,为什么需要它?

为什么要使用zod?

使用 Zod 进行类型验证的示例

Primitives

对象

类型推断

组合类型

注意事项

安全解析

无法识别的Key被删除

其他事项

Zod 与其他库的比较

结论

引言

这篇文章将描述如何使用Zod 为您的项目设置类型验证。Zod 是一个用于类型声明和验证的开源 TypeScript 库。我们将研究为什么使用 Zod 进行类型验证,提供如何使用它的示例,并将其与其他库进行比较。

什么是类型验证,为什么需要它?

类型验证是验证数据结构是否符合特定类型的过程。您可以使用它来确保输入数据的有效性,以及记录和执行代码的数据结构。

使用类型验证有两个主要好处:

运行时的数据完整性:确保数据以正确的格式输入您的系统有助于避免错误并保持数据一致性。虽然 TypeScript 可以帮助您在编译时确保类型安全,但当您处理来自未知数据(例如服务器或用户输入)的数据时,类型验证在运行时会大放异彩。

文档:一个好的类型验证库将为您使用的数据结构提供准确的类型定义。类型定义可用于为您的项目生成静态文档。

为什么要使用zod?

虽然有许多 TypeScript 类型校验库,但个人认为 Zod 是比较好的之一。在为您的项目选择库时,除了其功能集外,您还应考虑其实现细节。

Zod 具有零依赖性,这意味着您可以在没有任何其他库的情况下安装和使用 Zod,它将帮助您保持更小的包大小。

Zod 适用于 Node.js 和所有主流浏览器(包括 IE 11)。这使其成为需要支持各种平台的项目的不错选择。

Zod 被设计为 TypeScript 优先,这意味着该库将自动为您的数据结构推断静态 TypeScript 类型。这消除了两次声明类型的需要——一次在 Zod 中,一次在 TypeScript 中。它将为您节省大量输入,并帮助您保持代码更改同步。

Zod 的 API 简洁且可链接。这使得创建复杂的数据类型变得容易。您还可以轻松地将更简单的类型组合成更复杂的数据类型。

使用 Zod 进行类型验证的示例 Primitives

让我们看看如何验证字符串。假设我们要验证用户输入的密码。我们希望密码是一个非空字符串,长度至少为 8 个字符,最多为 32 个字符:

import { z } from "zod"; const stringSchema = z.string().nonempty().min(8).max(32); stringSchema.parse(""); stringSchema.parse(""); // throws an exception stringSchema.parse("I am a valid password"); // returns "I am a valid password"

当你运行上面的代码时,你会看到 parse 方法抛出了一个异常。异常将包含一个对象数组,其中包含ZodError错误的详细描述:

[ { "code": "too_small", "minimum": 1, "type": "string", "inclusive": true, "message": "Should be at least 1 characters", "path": [] }, { "code": "too_small", "minimum": 8, "type": "string", "inclusive": true, "message": "Should be at least 8 characters", "path": [] } ]

当您尝试解析有效字符串时,parse 将简单地返回其值。

对象

现在让我们继续讨论对象。Zod 对验证嵌套对象结构具有强大的支持。

让我们创建一个类型来验证用户对象。它将包含以下字段:

姓名

电子邮件

电话号码

要声明类型,我们使用z.object() 方法:

import { z } from "zod"; const User = z.object({ email: z.string().email(), name: z.string(), phoneNumber: z.number() });

让我们尝试根据我们刚刚创建的类型验证示例对象:

const result = User.parse({ email: "hi@sample.com", name: "Hello World" });

parse方法将返回一个包含解析结果的对象。由于我们忘记在示例中提供该phoneNumber字段,Zod 将抛出异常,并包含以下错误数组:

[ { "code": "invalid_type", "expected": "number", "received": "undefined", "inclusive": true, "message": "Required" "path": ["phoneNumber"] } ] 类型推断

我们还可以从对象中推断出类型。这是您可以免费获取属性的类型定义并在您的代码中使用它们的部分:

type UserType = z.infer<typeof User>; 组合类型

Zod 让您可以轻松地在彼此之上组合复杂的类型,就像您构建乐高积木一样。

为了证明这一点,让我们使用User上面的类型对象并构建一个更详细的具有爱好的用户对象:

const User = z.object({ email: z.string().email(), name: z.string(), phoneNumber: z.number() }); const Hobby = z.object({ hobbyName: z.string().min(1) }); const Hobbyist = User.merge(Hobby); const result = Hobbyist.safeParse({ email: "hi@sample.com", name: "Hello World", phoneNumber: 123 });

通过组合我们的两个类型对象,我们创建了一个新类型对象,您可以使用它来验证用户对象是否具有适当的爱好字段。

在现有对象之上组合新对象是一种很好的方法,因为它可以帮助您保持数据结构中的所有更改同步。

注意事项

在使用 Zod 进行验证时,需要牢记几件事。

安全解析

如果不想让Zod抛出异常,当解析失败时,可以改用该safeParse方法。这将返回一个包含解析结果的对象:

mySchema.safeParse(""I am a valid password""); // => { success: true; data: "I am a valid password" } mySchema.safeParse(""); // => { success: false; error: ZodError } 无法识别的Key被删除

默认情况下,Zod 在解析过程中会去除无法识别的key。这意味着任何未知的key都将被忽略。

如果您想通过无法识别的key而不丢失它们,您可以使用该.passthrough()方法。

其他事项

.array() 方法返回一个新的 ZodArray 实例,这意味着调用方法的顺序很重要。通过切换链中调用的顺序,您可以获得完全不同的结果:

z.string().optional().array(); // (string | undefined)[] z.string().array().optional(); // string[] | undefined Zod 与其他库的比较

其他广泛使用的类型验证库也是不错的选择,例如 yupio-ts

以下是您项目的选择Zod 的一些原因:

TypeScript 首次支持。Zod 在构建时考虑了 TypeScript,并具有一流的支持。这意味着您可以获得自动完成和出色的 VsCode 支持。

无需额外工作即可为您获取类型。

易于组合的类型对象 - 通过组合不同的类型对象来构建复杂的验证规则。

强大的错误处理。Zod 具有出色的错误处理功能,具有丰富的 API 用于配置错误处理流程。

支持 Promise 和函数模式。如果您需要验证函数或 Promise,Zod 可以满足您的需求。

结论

在这篇文章中,我们介绍了如何使用 Zod 库进行 TypeScript 类型验证。我们研究了如何创建类型和使用类型来验证数据结构。我们还看到了使用 Zod 时需要注意的一些事项以及它相对于其他库的优势。

有关 Zod 的更多信息,可以查看其 Github 页面上的 优秀文档 。

更多关于Zod TypeScript类型验证的资料请关注易知道(ezd.cc)其它相关文章!

推荐阅读

    公共CPU接口类型的详细描述

    公共CPU接口类型的详细描述,,我们知道CPU是电脑的大脑, CPU的处理速度直接决定电脑的性能, 那你知道CPU发展到现在, 都那些CPU接口类型吗.

    主板类型百科全书(基于芯片分类)

    主板类型百科全书(基于芯片分类),,电脑维修基础之主板型号熟悉,主板芯片型号区分,涵盖nVIDIA系列intel系列AMD系列主板型号,主板型号大全内容较

    C上的引导检查文件系统:文件的类型

    C上的引导检查文件系统:文件的类型,,故障现象:系统检查启动检查文件 每一次你启动一台计算机,都会是这样的。 在d上检查文件系统: 该文件

    asp中文图片验证码的实现代码

    asp中文图片验证码的实现代码,,这个代码是在别人的增加对汉字的基础功能,谢谢你,谢谢轻烟。 以前的图片验证代码很容易破解,所以在目前的基础

    电脑硬盘接|电脑硬盘接口类型怎么看

    电脑硬盘接|电脑硬盘接口类型怎么看,,电脑硬盘接口类型怎么看方法如下:1、在计算机上点击右键,选择设备管理器;2、点开磁盘驱动器就可以看到

    Python之可迭代对象、迭代器、生成器

    Python之可迭代对象、迭代器、生成器,迭代,生成器,一、概念描述可迭代对象就是可以迭代的对象,我们可以通过内置的iter函数获取其迭代器,可

    应用程序对象

    应用程序对象,,应用程序对象是一个应用程序级对象,用于在所有用户之间共享信息,并且在Web应用程序运行期间可以保存数据。 应用的性质: 方法