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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 18:30:41