组合与细化模式
使用 refine、transform 和联合类型构建复杂模式。
组合与细化模式 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 4 节课。
组合模式
Zod 模式是可组合的构建模块。您可以使用它们进行 refine、transform、extend 和组合,以描述复杂的验证规则。
import { z } from "zod";
const base = z.object({ name: z.string() });
// We will add rules and combine schemas from here.使用 refine 添加自定义规则
.refine 会添加一个带有错误消息的自定义验证谓词,用于实现 Zod 没有内置支持的规则。
import { z } from "zod";
const password = z.string().refine(
(s) => s.length >= 8,
{ message: "Must be at least 8 characters" }
);
// password.parse("short") throws with that message.跨字段 refine
将 .refine 应用于对象,可以验证字段之间的关系,例如确认两次输入的密码是否一致。
import { z } from "zod";
const form = z.object({
password: z.string(),
confirm: z.string()
}).refine((d) => d.password === d.confirm, {
message: "Passwords must match"
});
// Validates both fields together.转换值
.transform 会将已验证的值转换为另一种结构,并在验证成功后执行。
import { z } from "zod";
const trimmed = z.string().transform((s) => s.trim());
const result = trimmed.parse(" hi "); // "hi"可选字段
.optional() 允许字段缺失,这一点会同时反映在验证结果和推断出的类型中。
import { z } from "zod";
const schema = z.object({
name: z.string(),
bio: z.string().optional()
});
// bio may be omitted.默认值
.default 会在输入缺失时提供一个值,因此解析后的结果始终会填充该字段。
import { z } from "zod";
const schema = z.object({
retries: z.number().default(3)
});
const r = schema.parse({}); // { retries: 3 }联合模式
z.union 接受符合多个模式中任意一个的值,相当于 Zod 中的 TypeScript 联合类型。
import { z } from "zod";
const id = z.union([z.string(), z.number()]);
// id.parse("abc") and id.parse(123) both succeed.Zod 中的可辨识联合
z.discriminatedUnion 通过根据辨识字段进行切换,高效地验证带标签的联合类型。
import { z } from "zod";
const shape = z.discriminatedUnion("kind", [
z.object({ kind: z.literal("circle"), radius: z.number() }),
z.object({ kind: z.literal("square"), side: z.number() })
]);
// Picks the right member by kind.使用 extend 合并
.extend 会向现有对象模式添加字段,让您可以从较小的模式构建更大的模式。
import { z } from "zod";
const base = z.object({ id: z.number() });
const user = base.extend({ name: z.string() });
// user validates { id: number; name: string }组合对象模式
您也可以使用 .merge 合并两个对象模式,将它们的所有字段组合到一个模式中。
import { z } from "zod";
const a = z.object({ x: z.number() });
const b = z.object({ y: z.string() });
const combined = a.merge(b);
// combined validates { x: number; y: string }将所有内容串联起来
refine、transform、default 和扩展可以流畅地串联使用,在一个易读的模式中表达丰富的验证逻辑。
import { z } from "zod";
const signup = z.object({
email: z.string().refine(s => s.includes("@"), { message: "Invalid email" }),
age: z.number().default(18)
}).extend({
newsletter: z.boolean().optional()
});
// One schema, many rules.快速检查:组合模式
测试您对组合和 refine 模式的理解。
回顾:组合和 refine 模式
您学会了使用 .refine 添加自定义规则,使用 .transform 重塑值,使用 .optional 和 .default 处理缺失数据,使用 z.union 组合多个选项,以及使用 .extend 和 .merge 扩展模式。
import { z } from "zod";
const schema = z.object({ name: z.string() })
.extend({ age: z.number().default(0) })
.refine(d => d.name.length > 0, { message: "Name required" });
// Composed validation in one place.常见问题解答
「组合与细化模式」课时是免费的吗?
是的 — 「组合与细化模式」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 4 节课。
「组合与细化模式」这节课中我会学到什么?
使用 refine、transform 和联合类型构建复杂模式。 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 TypeScript Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「组合与细化模式」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 TypeScript Academy 课中编写并运行代码吗?
能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。