如何在Zod中未提供address时获取refine的ZodError而非invalid_type错误
解决Zod校验中必填字段阻止顶层Refine执行的问题
问题原因
Zod的校验逻辑是先执行结构校验(检查必填字段是否存在、类型是否匹配等),再执行顶层的refine规则。你的Schema中address是必填的object类型,当data1未提供address时,结构校验直接失败,抛出address的invalid_type错误,导致顶层的日期比较refine根本没有执行的机会。
解决方案
将address字段设置为可选(通过.optional()修饰),这样当address未提供时,结构校验会通过,Zod会继续执行顶层的refine逻辑,从而触发日期错误提示。
修改后的Schema代码
import { z } from "zod"; const Schema = z .object({ name: z.string(), description: z.string(), startDate: z.coerce.date().refine((date) => date > new Date(), { message: "Start date must be in the future", }), endDate: z.coerce.date(), // 将address设为可选字段 address: z.object({ detail: z.string().min(1, { message: "Address is required" }), cityCode: z.number(), }).optional(), }) .refine( (data) => { return data.startDate < data.endDate; }, { message: "Start date must be before end date", path: ["endDate"], } );
后续必填处理(可选)
如果在用户完成地址选择后需要address成为必填项,可以在提交阶段重新定义Schema:
// 提交时使用的Schema,address强制必填 const SubmitSchema = Schema.extend({ address: z.object({ detail: z.string().min(1, { message: "Address is required" }), cityCode: z.number(), }) });
内容的提问来源于stack exchange,提问作者Duy Nguyen
相关产品推荐
相关产品推荐

