0Pricing
TypeScript Academy · 课时

使用 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 路由处理器、Request/Response 类型
  2. 使用 zod 进行模式校验并推断 TS 类型
  3. 错误中间件与结果类型
← 返回 TypeScript Academy