如何从嵌套Zod Schema中剔除指定字段?
如何在Zod中剔除嵌套字段
没问题!Zod确实提供了直接剔除字段的能力,针对你这种嵌套在数组里的对象字段场景,咱们可以通过几步简单的操作实现:
针对单个嵌套字段的处理(仅处理data字段的schema)
你想要的是拿到不含name字段的data数组schema,只需要逐层拆解原schema,对嵌套的对象schema使用omit方法,再重新包装成数组即可:
import { z } from "zod"; const schema = z.object({ "name": z.number(), "age": z.number(), "data": z.array( z.object({ "id": z.string().optional(), "name": z.string().nonempty().optional(), }) ) }); // 1. 先取出data数组里的对象元素schema const dataElementSchema = schema.shape.data.element; // 2. 剔除对象里的name字段(omit会返回新的schema,不修改原有的) const dataElementWithoutName = dataElementSchema.omit({ name: true }); // 3. 把处理后的对象schema重新包装成数组schema const test = z.array(dataElementWithoutName); // 此时infer出来的类型就只保留id字段了 type typeTest = z.infer<typeof test>; // typeTest实际类型:Array<{ id?: string | undefined }>
生成完整的新Schema(整个结构中剔除嵌套字段)
如果你需要的是一个完整的新schema(原schema的所有字段保留,但data里的对象去掉name),可以用extend方法覆盖原有的data字段:
const newFullSchema = schema.extend({ data: test // 直接用上面处理好的test schema即可 }); // 新schema对应的类型也会自动更新 type NewFullType = z.infer<typeof newFullSchema>;
补充说明
Zod的omit方法专门用于移除对象schema中的指定字段,它是不可变的——也就是说原schema不会被修改,只会返回一个剔除了目标字段的新schema。对于多层嵌套的结构,只需要逐层定位到需要修改的子schema,再应用omit(或pick,用于保留指定字段)就可以灵活调整结构。
内容的提问来源于stack exchange,提问作者DevOverflow
相关产品推荐
相关产品推荐

