Yup 和 Zod 对比:校验库的新旧选择
Yup 是 React 表单时代的老牌校验库,Zod 是 TypeScript 原生的现代标准。本文从 Schema 定义、类型推导、生态集成全面对比。
新项目选 Zod——类型推导精确(z.infer)、TS 原生设计、生态集成最广(tRPC/RHF/Drizzle);Yup 适合 Formik 存量项目维护。两者 API 风格相似,迁移成本低。
基本盘
Yup:Joi 启发的浏览器友好校验库,Formik 时代成为 React 表单校验标配。
Zod:2020 年发布,TS 优先设计——Schema 即类型是它的核心命题,已成为全栈 TS 的事实标准。
Schema 定义
// Yup
const schema = yup.object({
email: yup.string().email().required(),
age: yup.number().min(18),
});
// Zod
const schema = z.object({
email: z.string().email(),
age: z.number().min(18).optional(),
});
风格相似——学习迁移成本都不高。
类型推导对比
这是分水岭:
// Zod:精确推导
type User = z.infer<typeof schema>; // { email: string; age?: number }
// Yup:推导存在但边角不精确(optional/嵌套的可选性标记常需手工修正)
type User2 = yup.InferType<typeof schema>;
Zod 的类型推导与运行时行为严格一致;Yup 在复杂 Schema 下的推导偏差是长期槽点。
复杂场景与生态
- 异步校验:两者都支持;Zod 的 refine/superRefine 更灵活;
- 转换管道:Zod 的 transform/preprocess 体系更完整;
- 生态:Zod 全胜——tRPC 输入校验、React Hook Form resolver、Drizzle ORM 集成、zod-to-openapi 文档生成。
迁移建议
Yup → Zod 的迁移是"逐 Schema 替换":API 映射直接,错误结构(issues vs inner)适配是主要工作量。新模块先用 Zod,存量随重构替换。
常见问题(FAQ)
Q:Yup 会停止维护吗?
仍在维护但创新停滞——校验库的焦点已移到 Zod 系(及 Valibot 等模块化变体)。
Q:纯 JS 项目选哪个?
都可(Zod 的 TS 优势失效后仍是优秀库);Valibot 的体积优势也可考虑。
Q:浏览器端体积对比?
Zod 核心 ~13KB(gzip),Yup 类似量级;极致体积敏感看 Valibot(模块化 tree-shaking)。
参考文档
本文依据公开文档整理,示例需按项目依赖版本验证;不将文档中的性能描述视为本项目实测结果。