如何为Zod coerce.date()自定义日期验证错误提示信息
Zod 日期校验自定义错误提示方案
你遇到的问题是因为z.coerce.date()不支持直接通过构造参数传入invalid_type_error,该选项仅适用于基础类型校验(如z.date())。以下是几种可行的自定义错误提示方案:
方案一:使用.refine()校验有效性
通过refine手动检查转换后的日期是否有效,自定义错误信息:
const appointmentSchema = z.object({ appointmentTime: z.coerce.date() .refine(date => !isNaN(date.getTime()), { message: '请输入有效的日期时间' }) });
原理:z.coerce.date()会将输入强制转换为Date对象,哪怕输入无效也会返回Invalid Date;通过date.getTime()是否为NaN判断日期有效性,触发自定义提示。
方案二:使用.pipe()结合基础日期校验
将强制转换后的结果传入z.date()校验,指定invalid_type_error:
const appointmentSchema = z.object({ appointmentTime: z.coerce.date() .pipe(z.date({ invalid_type_error: '请输入有效的日期时间' })) });
原理:coerce.date()完成转换后,pipe将结果交给z.date()校验,若转换后是无效日期,会触发invalid_type_error并使用自定义信息。
方案三:全局配置错误映射(适用于所有日期校验)
通过ZodErrorMap全局替换invalid_date类型的错误提示:
const customErrorMap: z.ZodErrorMap = (issue, ctx) => { if (issue.code === z.ZodIssueCode.invalid_date) { return { message: '请输入有效的日期时间' }; } return { message: ctx.defaultError }; }; z.setErrorMap(customErrorMap); const appointmentSchema = z.object({ appointmentTime: z.coerce.date() });
原理:全局覆盖Zod的错误信息生成逻辑,所有触发invalid_date错误的场景都会使用自定义提示。
内容的提问来源于stack exchange,提问作者Gustavo Sales
相关产品推荐
相关产品推荐

