编译时 TypeScript 给你静态类型;运行时数据来自 HTTP / 表单 / localStorage,类型再对也挡不住脏数据。Zod 用一份 schema 同时解决校验 + 类型推断 + 解析——写一次,TS 编译和运行时各拿所需。
TypeScript 只在编译时存在——API 返回 JSON、用户填表单、本地存储读出来的东西,TS 完全不知道长什么样。不校验就 as User 断言,是隐形炸弹。
一份 z.object({...}) schema 同时:(1) 运行时校验 (2) 自动推断 TS 类型 (3) 转换/解析数据。你写 schema,三件事一起到手——这就是为什么 2024 起 Zod 成为 TS 生态事实标准。
TS 只在编译时——HTTP/表单/存储读回来的数据 TS 管不到。Zod 与 Yup/Joi/io-ts 对比,v4 重写的意义。
z.string / z.number / z.object / z.array;parse 抛异常 vs safeParse 返回 Result;z.infer<typeof schema> 推断类型。
union / intersection / discriminatedUnion / tuple / record / map;optional、nullable、default、catch 的区别。
字符串 .min/.max/.regex/.email/.url;refine / superRefine 自定义校验;transform 把 string 变 Date、trim、parseInt。
.extend / .merge / .pick / .omit / .partial / .required;从一份 User schema 派生 CreateUser、UpdateUser、PublicUser——避免重复。
ZodError / issues 结构;formatError / flatten;自定义 errorMap 支持中文错误;映射到表单字段显示。
React Hook Form + @hookform/resolvers/zod;Next.js Server Actions + Conform;TanStack Form;类型推导从 schema 贯穿到 UI。
tRPC input/output schema;Hono zValidator;zod-to-openapi/@asteasolutions/zod-to-openapi 从 schema 自动生成 OpenAPI 文档。
v4 重写——parse 快 14 倍、bundle 小 3 倍、新的 z.iso.datetime / z.record 行为;@standard-schema/spec 与 Valibot/ArkType 互操作。
环境变量校验、LLM 输出结构化解析、DB 行映射、缓存反序列化;parse 抛异常别当控制流;schema 重用的目录组织。
直接看第 2 章 schema/parse/infer,再到第 5 章组合、第 7 章表单集成。不到半天能用于生产。
看第 1 章对比,第 4 章 refine/transform 对应 Yup 的 test/transform,第 9 章了解 v4 重写后性能和体积的突破。