You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 13:08:18