亲宝软件园·资讯

展开

Zod TypeScript类型验证

技术爬行之旅 人气:4

引言

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

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

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

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

为什么要使用zod?

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

使用 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 的一些原因:

结论

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

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

更多关于Zod TypeScript类型验证的资料请关注其它相关文章!

加载全部内容

相关教程
猜你喜欢
用户评论