使用Zod的z.nativeEnum校验性别字段,自定义错误消息不生效
问题原因及解决方案
你的问题出在**required_error的配置位置错误**,以及未明确标记字段为必填:
- Zod的
z.nativeEnum()的第二个配置参数仅支持枚举类型校验相关的错误(比如传入非枚举成员的值),并不支持required_error属性——这个属性是用来配置「字段必须存在」的校验错误,不属于枚举类型校验的配置范围。 - 如果不给字段添加
.required(),当未选择选项导致字段值为undefined时,Zod会默认认为该字段是可选的,不会触发必填校验逻辑。
正确写法
基础场景:确保字段必须存在且为枚举成员
gender: z.nativeEnum(Gender, { invalid_type_error: 'Le sexe doit être homme ou femme.', }).required({ message: 'Le sexe est obligatoire' }),
特殊场景:表单未选择时提交空字符串
如果你的表单在未选择选项时会提交空字符串""而非undefined,需要先预处理空值再做校验:
gender: z.preprocess( (val) => val === "" ? undefined : val, z.nativeEnum(Gender, { invalid_type_error: 'Le sexe doit être homme ou femme.', }).required({ message: 'Le sexe est obligatoire' }) ),
配置后效果:
- 字段缺失或值为
undefined时,显示自定义必填错误Le sexe est obligatoire - 传入非枚举成员的值(比如空字符串、其他无效值)时,显示
Le sexe doit être homme ou femme.
内容的提问来源于stack exchange,提问作者Ismail_Aj
相关产品推荐
相关产品推荐

