如何将ZodEffect与ZodObject合并?解决合并类型错误
Zod Schema合并时处理ZodEffect类型的问题
问题描述
我有两个Zod Schema,希望在第二个Schema中复用第一个的结构。当第一个Schema未使用refine或superRefine方法时,合并操作正常;但第二个Schema调用refine后会变成ZodEffect类型,此时使用merge方法会出现类型错误,请问如何获取其底层的ZodObject来完成合并?
示例代码:
import { z } from 'zod'; const FirstSchema = z.object({ name: z.string().min(1), }); const SecondSchema = z .object({ lastname: z.string().min(1), }) .refine((data) => data.lastname.includes('foo')); const MergedSchema = FirstSchema.merge(SecondSchema); // <-- 此处报错,需将ZodEffect转为ZodObject
解决方案
方法1:先合并对象结构,再添加校验逻辑
这是最稳妥的方式,先把两个纯ZodObject合并,再统一添加refine校验,从根源避免ZodEffect类型冲突:
import { z } from 'zod'; const FirstSchema = z.object({ name: z.string().min(1), }); // 先定义不带校验的基础结构 const BaseSecondSchema = z.object({ lastname: z.string().min(1), }); // 合并后再添加校验 const MergedSchema = FirstSchema.merge(BaseSecondSchema).refine((data) => data.lastname.includes('foo'));
方法2:提取ZodEffect的底层Schema(依赖内部属性)
如果必须保留已有的带refine的Schema,可以通过Zod内部的_def.schema属性获取被包裹的底层ZodObject,再进行合并。注意:这是Zod的内部实现细节,未来版本可能发生变化,谨慎使用:
import { z } from 'zod'; const FirstSchema = z.object({ name: z.string().min(1), }); const SecondSchema = z .object({ lastname: z.string().min(1), }) .refine((data) => data.lastname.includes('foo')); // 提取底层对象后合并,再复用原有的校验逻辑 const MergedSchema = FirstSchema.merge(SecondSchema._def.schema).refine(SecondSchema._def.refinement);
内容的提问来源于stack exchange,提问作者Jeremy
相关产品推荐
相关产品推荐

