如何用Zod Schema验证一级至N级嵌套数据结构?
解决方案
问题出在你定义的嵌套结构上——你的nestedSchema用了固定的child键,但实际数据是用动态键名来实现层级嵌套的,而非固定属性名。
正确的做法是定义一个递归的Zod Schema,允许每个节点要么是包含title的叶子对象,要么是一个由动态键名组成的、值为该递归Schema的对象。
正确代码实现
import { z } from "zod"; // 递归定义节点Schema:要么是叶子节点(带title),要么是分支节点(动态键映射到节点) const NodeSchema = z.union([ z.object({ title: z.string() }), z.record(z.lazy(() => NodeSchema)) ]); // 顶层Schema是动态键映射到节点的对象 const TestSchema = z.record(NodeSchema); // 验证测试数据 const isValid = TestSchema.safeParse(testData); if (!isValid.success) { console.log("error", isValid.error); } else { console.log("success"); }
代码说明
- 递归Schema:使用
z.lazy()来实现递归引用,避免Zod在初始化时找不到未定义的Schema。 - Union类型:每个节点可以是两种类型之一:
- 叶子节点:
{ title: string },对应一级数据。 - 分支节点:
Record<string, NodeSchema>,对应N级嵌套的动态键结构。
- 叶子节点:
- 顶层验证:顶层是一个
Record<string, NodeSchema>,完美匹配你的测试数据结构。
这个Schema可以兼容任意层级的嵌套数据,无论是一级、二级还是更深的层级,只要每个叶子节点都包含title字符串即可。
内容的提问来源于stack exchange,提问作者WhatisSober
相关产品推荐
相关产品推荐

