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

如何在不修改原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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:22:09