如何实现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
相关产品推荐
相关产品推荐

