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

在react-hook-form中如何修改Zod数组的自定义错误提示?

解决Zod + React-Hook-Form数组字段默认错误提示问题

当复选框组未勾选时,React-Hook-Form会将字段值设为null,而Zod的z.array()默认不接受null类型,因此触发默认的"Expected array, received null"错误。以下两种方法可设置自定义友好提示:

方法1:用preprocess转换null为空数组

通过z.preprocess将null值转换为空数组,让Zod继续执行后续的min(1)验证,从而触发自定义提示:

promotion: z.object({
  id: z.string().optional(),
  name: z.string({
    required_error: "请填写活动名称",
    invalid_type_error: "请填写活动名称",
  }).min(1, "请填写活动名称").max(150, "活动名称不能超过150字符"),
  email: z.string({
    required_error: "请填写邮箱",
    invalid_type_error: "邮箱格式无效",
  }).email("邮箱格式无效").min(1, "请填写邮箱"),
  promos: z.preprocess(
    // 将null转换为空数组
    (val) => val ?? [],
    z.array(
      z.string({
        required_error: "请选择促销活动",
        invalid_type_error: "促销选项格式无效"
      })
    ).min(1, "请至少选择一个促销活动")
  ),
}),

方法2:允许null并设置类型错误提示

先通过.nullable()允许null值,再用.transform()转为空数组,同时给z.array()设置自定义invalid_type_error:

promotion: z.object({
  id: z.string().optional(),
  name: z.string({
    required_error: "请填写活动名称",
    invalid_type_error: "请填写活动名称",
  }).min(1, "请填写活动名称").max(150, "活动名称不能超过150字符"),
  email: z.string({
    required_error: "请填写邮箱",
    invalid_type_error: "邮箱格式无效",
  }).email("邮箱格式无效").min(1, "请填写邮箱"),
  promos: z.array(
    z.string({
      required_error: "请选择促销活动",
      invalid_type_error: "促销选项格式无效"
    })
  )
  .nullable()
  .transform((val) => val ?? [])
  .min(1, "请至少选择一个促销活动")
  .invalid_type_error("请至少选择一个促销活动"),
}),

效果说明

两种方法都能让未勾选复选框时,显示自定义的"请至少选择一个促销活动"提示,替代Zod默认的"Expected array, received null"错误。

内容的提问来源于stack exchange,提问作者douglasrcjames

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 16:15:01