使用 zod 进行模式校验并推断 TS 类型
使用 zod 校验请求;从模式推断 TypeScript 类型;添加安全的中间件和错误处理。
使用 zod 进行模式校验并推断 TS 类型 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 2 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 3 节课。
入门
目标:使用 zod 验证传入数据,并通过 z.infer 让 TypeScript 类型保持同步。您将安全地解析数据,发送有帮助的错误信息,并将验证接入中间件。
- 只定义一次模式
- 推断 TS 类型
- safeParse + 400 错误
模式与类型推断
使用 zod 建模一次。派生的 type User = z.infer<typeof userSchema> 与验证规则完全一致。
import { z } from "zod"
export const userSchema = z.object({
id: z.string().regex(/^u_[a-z0-9]+$/),
name: z.string().min(1),
age: z.number().int().nonnegative().optional()
})
export type User = z.infer<typeof userSchema>
// Reuse `User` across handlers, services, and tests在处理程序中使用 safeParse
使用 safeParse 避免异常;返回带有格式化问题的400 响应。响应类型同时反映成功和错误的数据形状。
import { Request, Response } from "express"
import { userSchema, User } from "./schema"
export function createUser(req: Request<{}, User, unknown>, res: Response<User | { error: string; issues?: unknown }>) {
const parsed = userSchema.safeParse(req.body)
if (!parsed.success) {
return res.status(400).json({ error: "Invalid body", issues: parsed.error.format() })
}
const user = parsed.data
return res.status(201).json(user)
}中间件辅助工具
创建可复用的中间件。它会解析请求体,并附加带类型的数据,或返回包含详细信息的 400 响应。
import { z } from "zod"
import { Request, Response, NextFunction } from "express"
export function validateBody<T extends z.ZodTypeAny>(schema: T) {
return (req: Request, res: Response, next: NextFunction) => {
const r = schema.safeParse(req.body)
if (!r.success) {
return res.status(400).json({ error: "Invalid body", issues: r.error.format() })
}
req.body = r.data
next()
}
}类型强制转换与 refine
使用 z.coerce 接受字符串形式的数字,使用 z.enum 处理已知值,并使用 .refine 处理跨字段规则。
import { z } from "zod"
const signupSchema = z.object({
email: z.string().email(),
age: z.coerce.number().int().gte(13),
role: z.enum(["user", "admin"]).default("user")
}).refine(v => v.role !== "admin" || v.age >= 18, { message: "admin must be adult" })
export type Signup = z.infer<typeof signupSchema>
// Coercion allows numbers in strings; refine adds cross-field rules错误提示
错误提示:
- 始终在边界处使用
safeParse。 - 为客户端格式化问题,避免泄露堆栈跟踪。
- 如果捕获了抛出的解析错误,请将未知值收窄为
ZodError。
zod 类型推断检查
快速检查:如何让 TS 类型与 zod 模式保持同步?
回顾
回顾:定义一个模式,推断 TS 类型,使用 safeParse 进行验证,并将其接入中间件,以统一处理 400 错误。
常见问题解答
「使用 zod 进行模式校验并推断 TS 类型」课时是免费的吗?
是的 — 「使用 zod 进行模式校验并推断 TS 类型」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 3 节课。
「使用 zod 进行模式校验并推断 TS 类型」这节课中我会学到什么?
使用 zod 校验请求;从模式推断 TypeScript 类型;添加安全的中间件和错误处理。 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 TypeScript Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 3 节。
「使用 zod 进行模式校验并推断 TS 类型」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 TypeScript Academy 课中编写并运行代码吗?
能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 路由处理器、Request/Response 类型
- 使用 zod 进行模式校验并推断 TS 类型
- 错误中间件与结果类型