如何为Record类型声明递归Zod Schema?
递归Zod Schema实现方案
针对你描述的嵌套Record结构,使用Zod的z.lazy()方法即可实现递归Schema定义,核心是通过延迟初始化来避免递归引用的初始化冲突。
完整代码实现
import { z } from "zod"; // 定义递归节点Schema:对应properties中的子项结构 const NodeSchema = z.lazy(() => z.object({ title: z.string(), code: z.string(), // properties为可选的string键Record,值为当前节点类型 properties: z.record(z.string(), NodeSchema).optional() }) ); // 定义顶层根Schema const RootSchema = z.object({ title: z.string(), properties: z.record(z.string(), NodeSchema) }); // 导出TypeScript类型(可选) export type Node = z.infer<typeof NodeSchema>; export type RootSchemaType = z.infer<typeof RootSchema>;
验证示例
将你给出的示例数据代入验证:
const testData = { title: "Root Title", properties: { XYZ: { title: "XYZ Title", code: "XYZ_CODE", properties: { ABC: { title: "ABC Title", code: "ABC_CODE" } } } } }; const validationResult = RootSchema.safeParse(testData); console.log(validationResult.success); // 输出 true
变体说明
如果顶层结构与子节点结构一致(比如顶层也包含code字段),可以合并为单个递归Schema:
const RecursiveSchema = z.lazy(() => z.object({ title: z.string(), code: z.string(), properties: z.record(z.string(), RecursiveSchema).optional() }) );
内容的提问来源于stack exchange,提问作者Nandikaa Thiyagarajan
相关产品推荐
相关产品推荐

