你是否曾为 API 返回的 JSON 数据结构不一致而反复加 if (data?.user?.name) 防御性判断?是否在表单提交后才发现后端返回的字段名是 user_name 而非 username,导致 TypeScript 类型完全失效?Zod 正是为此而生:它不是简单的校验库,而是将 TypeScript 的静态类型能力「延伸到运行时」的桥梁——你用 TypeScript 写 schema,它就还你一个 100% 类型安全、不可篡改、带精准错误定位的解析结果。
核心功能
- 零成本类型推导:定义
z.object({ name: z.string() })后,.parse()返回值自动获得{ name: string }类型,无需手动写interface或type,TypeScript 编译器全程自动识别,告别类型声明与校验逻辑脱节。 - 深度克隆 + 类型净化:解析成功后返回的是原始输入的深拷贝(非引用),且只保留 schema 中声明的字段——多余字段被自动过滤,缺失字段抛错,彻底杜绝「脏数据污染状态」问题,尤其适合处理第三方 API 或用户上传的 JSON。
- 异步校验原生支持:通过
.refine(async () => ...)或.transform(async () => ...)可无缝集成数据库查重、文件尺寸检测、远程身份验证等耗时操作,且自动提供.parseAsync()方法,无需手动处理 Promise 链。 - 超轻量无依赖:核心包仅 2KB(gzip),不依赖 Lodash、Ajv 等任何外部库,浏览器中可直接通过 ES 模块导入,Node.js 中开箱即用,对构建体积和启动性能极度友好。
- JSON Schema 双向互通:调用
schema.toJsonSchema()一键生成标准 JSON Schema(兼容 OpenAPI/Swagger),反向也可从 JSON Schema 解析为 Zod Schema,轻松打通前后端契约、文档生成与低代码平台。 - AOT 编译加速关键路径:对高频调用的校验(如登录接口、实时消息解析),使用
z.compile(schema)可实现最高 9 倍性能提升,编译后跳过动态 dispatch,直击底层类型检查,同时保留完整错误堆栈——速度与调试体验兼得。 - 错误信息颗粒度极细:校验失败时抛出
ZodError,包含每个字段的错误码(invalid_type、too_small)、具体路径(["user", "profile", "age"])、期望类型和实际值,前端可精准高亮错误字段,后端可生成结构化错误响应。 - 全环境一致性:同一套 schema 在 Vite/Next.js/Webpack 构建的前端、Node.js 服务端、Deno 边缘函数、甚至 Deno Deploy 中行为完全一致,消除「本地跑通,线上报错」的环境陷阱。
技术亮点
- TypeScript First 设计哲学:Zod 不是「为 JS 加类型」,而是「让 TS 类型在运行时活起来」。其所有 API(
z.string().min(3).email())均基于 TypeScript 泛型推导,而非字符串配置或运行时反射,确保类型系统与校验逻辑零割裂。 - 不可变(Immutable)架构:所有链式方法(
.optional()、.default()、.refine())均返回新 schema 实例,避免意外修改共享 schema 导致的隐蔽 bug,天然适配 React/Vue 的响应式更新模式。 - 精巧的 AOT 编译机制:采用
new Function动态生成校验函数(类似 Babel 插件),但严格遵循「安全降级」原则——CSP 环境自动禁用;含异步逻辑的 schema 直接回退至标准解析器;错误时两次执行确保报错位置精确,兼顾性能与可靠性。 - 零运行时类型擦除:不同于某些库在生产环境移除类型检查,Zod 的校验逻辑始终存在,且可通过
z.setProcessEnvDefaults(false)等配置精细控制,满足金融、医疗等强合规场景需求。 - 生态扩展无侵入:通过
z.custom()和z.ZodType接口,可自由封装正则校验、i18n 错误消息、与 class-validator/zod-dto 等方案互操作,社区已沉淀超 50 个官方认证插件(如zod-i18n、zod-prisma)。
适合哪些人用
Zod 是以下开发者的理想选择:
- 全栈 TypeScript 工程师:统一前后端数据契约,例如 Next.js API Route 中用 Zod 校验请求体,再将结果直接传给 Prisma Client,全程无类型断层;
- 前端框架深度使用者(React/Vue/Svelte):结合
react-hook-form或vuelidate,用 Zod 定义表单 schema,自动生成校验规则、错误提示文案和默认值,大幅提升表单开发效率; - API 中间件开发者:在 Express/Koa/NestJS 中编写 Zod 中间件,对所有请求/响应进行自动化结构校验与清洗,替代手写的
if (!req.body.email) throw new Error(...)。
快速上手
安装仅需一条命令:
npm install zod
三行代码完成典型校验流程:
import * as z from "zod";
// 1. 定义 schema(自动推导 TypeScript 类型)
const LoginForm = z.object({
email: z.string().email(),
password: z.string().min(8),
});
// 2. 解析并获得强类型数据
const data = LoginForm.parse(req.body); // 类型为 { email: string; password: string }
// 3. 安心使用,无须二次类型断言
console.log(`Login attempt from ${data.email}`);
同类对比 / 注意事项
- vs Joi / Yup:Joi 语法冗长(
Joi.object({ name: Joi.string().required() })),Yup 依赖运行时字符串校验,二者均无法提供 Zod 级别的静态类型推导;Zod 的z.infer可直接提取类型,减少 70% 重复定义。 - vs Ajv:Ajv 专注 JSON Schema,需额外维护 schema 文件与 TS interface 映射;Zod 用纯 TS 代码定义,编辑器智能提示、重构支持、单元测试覆盖率均更优。
- 注意事项:Zod 默认开启
stripUnknown: true(过滤未知字段),若需保留所有字段,请显式设置z.object({...}, { unknownKeys: "passthrough" });AOT 编译不支持异步 schema,高频异步校验建议拆分为同步基础校验 + 异步业务校验两阶段。
项目信息
TypeScript-first schema validation with static type inference
43.8k
今日 +277 stars this week
Stars
2.2k
Forks
TypeScript
MIT
TypeScript | 43,823 ⭐ | MIT 开源协议 | GitHub 项目地址
如果你厌倦了在类型系统与运行时之间反复横跳,Zod 就是你一直在找的那个「一次定义、处处生效、永远可信」的数据守门员。


