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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:25:18