如何从复杂Zod对象中递归移除指定属性someProp?
递归移除Zod对象中所有
someProp属性的正确实现 你的代码问题出在只给最外层的Zod对象做了omit,嵌套子对象里的someProp根本没处理到,而且粗暴的类型断言也容易埋下类型隐患。下面是修正后的实现:
import { ZodObject, ZodRawShape, z } from "zod"; function removeSomeProp<T extends ZodRawShape>(shape: T): ZodRawShape { const processedShape: ZodRawShape = {}; Object.entries(shape).forEach(([key, schema]) => { // 遇到嵌套ZodObject,递归处理其内部结构 if (schema instanceof ZodObject) { processedShape[key] = z.object(removeSomeProp(schema.shape)).omit({ someProp: true }); } else { processedShape[key] = schema; } }); // 对当前层级也执行omit,移除当前层的someProp return z.object(processedShape).omit({ someProp: true }).shape; } // 使用示例 const originalSchema = z.object({ name: z.string(), someProp: z.number(), nested: z.object({ age: z.number(), someProp: z.boolean(), deepNested: z.object({ id: z.string(), someProp: z.date() }) }) }); // 生成清理后的Schema const cleanedSchema = z.object(removeSomeProp(originalSchema.shape)); // 验证:所有层级的someProp已被移除 cleanedSchema.parse({ name: "test", nested: { age: 20, deepNested: { id: "123" } } }); // 执行正常,无报错
关键改进点:
- 每层都执行移除操作:不管是顶层还是嵌套子对象,处理完内部结构后都会调用
.omit({ someProp: true }),确保所有层级的目标属性被清除 - 递归遍历嵌套结构:遇到
ZodObject类型的属性时,递归处理其shape,再重新包装为ZodObject并执行移除 - 更严谨的类型处理:返回
ZodRawShape而非强行断言原类型,避免类型不匹配问题,最终由调用方用z.object()包装成完整Zod对象
内容的提问来源于stack exchange,提问作者user358041
相关产品推荐
相关产品推荐

