如何在不修改原Zod嵌套Schema的情况下扩展其键?
问题描述
原始Zod Schema:
const schema = z.object({ nested1: z.object({ nested2: z.object({ nested3: z.string(), dummy1: z.string(), dummy2: z.string(), }), }), });
想要生成的目标Schema(仅给nested3添加.catch(null),保留其他字段):
const secondSchema = z.object({ nested1: z.object({ nested2: z.object({ nested3: z.string().catch(null), dummy1: z.string(), dummy2: z.string(), }), }), });
尝试直接用schema.extend()覆盖nested2会丢失dummy1和dummy2字段,需要用最少重复代码实现需求。
解决方案
利用Zod对象的shape属性获取嵌套结构,逐层进行extend操作,只修改目标字段,保留原有字段:
简洁链式写法
const secondSchema = schema.extend({ nested1: schema.shape.nested1.extend({ nested2: schema.shape.nested1.shape.nested2.extend({ nested3: z.string().catch(null) }) }) });
分步写法(更易读)
// 1. 基于原nested2结构,修改nested3字段 const updatedNested2 = schema.shape.nested1.shape.nested2.extend({ nested3: z.string().catch(null) }); // 2. 基于原nested1结构,替换nested2为修改后的版本 const updatedNested1 = schema.shape.nested1.extend({ nested2: updatedNested2 }); // 3. 基于原schema,替换nested1为修改后的版本 const secondSchema = schema.extend({ nested1: updatedNested1 });
原理说明
- Zod的
shape属性可以直接访问对象schema定义的所有字段结构 .extend()方法会在原有字段的基础上新增或覆盖指定字段,而非完全替换整个对象schema- 通过逐层嵌套
extend,既能只修改目标字段nested3,又能完整保留dummy1、dummy2等原有字段,避免重复代码
内容的提问来源于stack exchange,提问作者Tal Rofe
相关产品推荐
相关产品推荐

