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

如何实现Zod嵌套Schema的深度可选?解决deepPartial丢失字段问题

如何获取Zod嵌套Schema的完整可选结构副本

我需要生成一个Zod嵌套Schema的完整结构副本,让所有字段及嵌套对象均变为可选。

以下是我的示例代码:

import { z, ZodTypeAny, ZodObject } from 'zod';

function deepShapeLog(schemanName: string, schema: ZodTypeAny, indent = 0) {
    const indentStr = ' '.repeat(indent);
    console.log(`${indentStr}${schemanName} : ${schema._def.typeName}`);
    if (schema instanceof ZodObject) {
        for (const key in schema.shape) {
            deepShapeLog(key, schema.shape[key], indent + 4);
        }
    }
}

const deepObj1 = z.object({
    obj1: z.object({
        obj2: z.object({
            obj3: z.object({
                field4: z.string(),
                field5: z.string()
            }),
            field6: z.number(),
        }),
        field7: z.boolean()
    }),
    field8: z.date(),
})

deepShapeLog('deepObj1', deepObj1);
const deepObj1Partial = deepObj1.deepPartial();
deepShapeLog('\ndeepObj1Partial', deepObj1Partial);

/* node v20.8.0 + zod 3.22.4 输出结果:
    deepObj1 : ZodObject
        obj1 : ZodObject
            obj2 : ZodObject
                obj3 : ZodObject
                    field4 : ZodString
                    field5 : ZodString
                field6 : ZodNumber
            field7 : ZodBoolean
        field8 : ZodDate

    deepObj1Partial : ZodObject
        obj1 : ZodOptional
        field8 : ZodOptional
*/

我尝试用ZodObject.deepPartial()方法,但它会丢失嵌套对象内的字段;自己写递归函数时,ZodObject的复制构造函数会丢失嵌套字段,导致递归展开时子结构消失。已经花了8小时解决这个问题,甚至试过非递归函数,还是没找到办法。

奇怪的是,VS Code的TypeScript编译器显示类型完全正常,但运行时所有子结构都消失了。

内容的提问来源于stack exchange,提问作者Philip Wilson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 01:39:53