使用 Zod 进行架构验证
集成 @hookform/resolvers 和 Zod 架构,实现类型安全的表单验证。
使用 Zod 进行架构验证 是 CoddyKit 上的免费 React Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。
欢迎
在本课中,您将通过 @hookform/resolvers 将 React Hook Form 与 Zod 架构集成,为表单和 TypeScript 类型提供统一的真实来源,从而实现类型安全的验证。
为什么使用架构验证?
将验证规则直接写在 register() 中会变得冗长且难以复用。Zod 架构可以在一个地方定义所有(ALL)验证规则,自动推导 TypeScript 类型,还可以在前端和后端之间共享。
安装
安装 Zod 和 RHF 解析器包。
npm install zod @hookform/resolvers定义 Zod 架构
使用 z.object() 定义表单结构。每个字段都使用带有链式验证方法的 Zod 类型。
import { z } from 'zod';
const loginSchema = z.object({
email: z.string().email('Invalid email'),
password: z.string().min(8, 'At least 8 characters'),
});推导 TypeScript 类型
使用 z.infer 自动从 Zod 架构推导 TypeScript 类型。无需单独的接口。
type LoginForm = z.infer<typeof loginSchema>;
// { email: string; password: string }通过解析器连接到 useForm
将 zodResolver(schema) 传给 useForm 的 resolver 选项。RHF 会使用 Zod 验证表单,而不是使用直接写入字段的规则。
import { zodResolver } from '@hookform/resolvers/zod';
const { register, handleSubmit, formState } = useForm<LoginForm>({
resolver: zodResolver(loginSchema),
});不再需要直接写入字段的规则
使用 zodResolver 后,您不再需要将规则传给 register()。只需调用不带第二个参数的 register('fieldName')。所有验证都由 Zod 处理。
<input {...register('email')} />
{errors.email && <p>{errors.email.message}</p>}复杂的 Zod 校验
Zod 支持强大的校验:url()、uuid()、regex() 可用于自定义逻辑,refine() 可用于自定义逻辑,superRefine() 可用于跨字段校验。
const schema = z.object({
url: z.string().url('Must be a valid URL'),
confirmPassword: z.string(),
}).refine(
data => data.password === data.confirmPassword,
{ message: 'Passwords must match', path: ['confirmPassword'] }
);跨字段校验
Zod 的 refine() 或 superRefine() 可以访问所有字段值,从而实现“结束日期必须晚于开始日期”这类跨字段规则。
const schema = z.object({
start: z.string(),
end: z.string(),
}).refine(d => d.end > d.start, {
message: 'End must be after start',
path: ['end'],
});与后端共享 schema
在全栈 TypeScript 项目中,请从共享模块导出 Zod schema。在 React 表单 AND 您的 Node.js/Next.js 接口处理程序中同时使用它,以确保校验保持一致。
// shared/schemas.ts
export const loginSchema = z.object({ ... });
// frontend — import and use as resolver
// backend — import and call .parse() on request body快速检查
在 TypeScript 中,为表单类型使用 z.infer 的主要优势是什么?
回顾
定义 Zod schema,使用 z.infer 推断 TypeScript 类型,将 zodResolver 传递给 useForm,并移除内联校验规则。使用 refine() 进行跨字段校验,并在前端与后端之间共享 schema。
接下来
下一课:**使用 useFieldArray 管理动态字段**——您将使用 useFieldArray 钩子添加、删除和重新排序动态表单字段。
常见问题解答
「使用 Zod 进行架构验证」课时是免费的吗?
是的 — 「使用 Zod 进行架构验证」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。
「使用 Zod 进行架构验证」这节课中我会学到什么?
集成 @hookform/resolvers 和 Zod 架构,实现类型安全的表单验证。 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 React Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 React Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「使用 Zod 进行架构验证」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 React Academy 课中编写并运行代码吗?
能。每节 React Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- React Hook Form 入门
- 验证规则与错误消息
- 使用 Zod 进行架构验证
- 使用 useFieldArray 创建动态字段