Zod
目前 TypeScript 生态中最流行的数据验证库,专为 TypeScript 优先设计
Zod 是目前 TypeScript 生态中最流行的数据验证库,专为 TypeScript 优先设计,通过极简的声明式 API 让开发者定义数据结构 Schema,并对任意输入数据进行验证,同时获得完全类型安全的解析结果。项目至今已在 GitHub 获得超过 4 万 Star,是 tRPC、Prisma、Deno Deploy 等知名开源项目的首选验证方案。
项目简介
Zod 由独立开发者 Colin Hall 创作和维护,核心理念是「让你的运行时数据与编译时类型保持一致」。传统的 TypeScript 类型系统只在编译阶段有效,程序运行后类型信息全部丢失,外部输入(如 API 请求体、数据库数据、用户表单)无法被验证。Zod 通过定义 Schema 并调用 .parse() 方法,在运行时对数据进行验证,验证通过后返回完全类型化的对象,彻底消除了「类型和实际数据不符」这一类 Bug。
核心功能
声明式 Schema 定义:Zod 提供 z.string()、z.number()、z.boolean()、z.object({})、z.array({}) 等一系列 Schema 构造器,开发者可以用链式 API 定义任意复杂的数据结构,包括嵌套对象、可选字段、默认值、联合类型、枚举值等。
零运行时类型转换开销:.parse() 方法在验证通过后直接返回 TypeScript 类型安全的对象,不需要额外的类型断言(as)或类型守卫(type guard)代码,显著减少样板代码。
不可变 API 设计:所有 Schema 方法(如 .optional()、.nullable()、.transform())都返回新的 Schema 实例而非修改原实例,符合函数式编程最佳实践,也更方便测试和复用。
内置 JSON Schema 导出:Zod Schema 可以一键转换为 JSON Schema,可用于 OpenAPI/Swagger 文档生成、API 契约定义等场景,打通前后端数据协议。
丰富的验证规则:内置 email、url、uuid、CUID、正则表达式匹配、数字范围、字符串长度、枚举值等验证规则,无需额外依赖即可覆盖绝大多数业务验证场景。
广泛的生态系统:Zod 生态包括 zod-to-json-schema、zod-to-ts、@hookform/resolvers(表单集成)、trpc(端到端类型安全 API)等大量配套工具,覆盖从前端表单到后端 API 的全链路。
技术实现
Zod 的核心实现基于 TypeScript 的条件类型(Conditional Types)和映射类型(Mapped Types)。每个 Schema 实际上是一个泛型类,.parse() 方法内部通过 TypeScript 的类型推导能力,在验证通过后将 unknown 类型收窄为目标类型返回。例如 z.object({ name: z.string() }).parse(input) 返回 { name: string } 类型而非 any。
Zod 完全不依赖任何第三方运行时库,仅靠 TypeScript 自身能力实现所有功能,核心包压缩后仅约 2KB(gzip),对前端项目几乎零负担。验证逻辑采用递归下降解析器模式,对象和数组字段逐层验证,支持自定义错误信息,支持设置 strict 模式拒绝未知字段。
快速上手
第一步,安装 Zod:在项目目录执行 npm install zod 或 pnpm add zod;
第二步,定义数据结构 Schema: import * as z from "zod"; const User = z.object({ name: z.string().min(2, "名字至少2个字符"), email: z.string().email("邮箱格式不正确"), age: z.number().optional(), });
第三步,验证外部输入数据: const result = User.safeParse(req.body); if (!result.success) { console.log(result.error.issues); } else { const user = result.data; // 类型为 { name: string; email: string; age?: number } }
第四步,与 tRPC 或 Next.js API 集成:Zod 是 tRPC 的默认验证方案,在 tRPC 路由中直接使用 Schema 验证输入,即可实现端到端类型安全的 API 调用,无需手动编写类型守卫代码。
适用人群
TypeScript 开发者:需要确保 API 输入、数据库数据、外部 API 响应与 TypeScript 类型一致的开发团队和个人; 全栈工程师:使用 Next.js/Nuxt + tRPC/GraphQL 构建全栈应用时,需要类型安全的输入验证; 开源库作者:编写需要接收用户配置数据的 npm 包时,用 Zod 做配置 Schema 验证并导出类型。
评论与建议
登录 后参与评论或提建议