定制错误
在 Zod 中,验证错误以 z.core.$ZodError 类的实例形式呈现。
zod 包中的 ZodError 类是一个子类,实现了一些额外的便利方法。
$ZodError 的实例包含 .issues 数组。每个 issue 包含一个人类可读的 message 和关于该问题的其他结构化元数据。
每个 issue 都包含一个带有人类可读错误信息的 message 属性。错误信息可以通过多种方式自定义。
error 参数
几乎所有 Zod API 都接受一个可选的错误消息。
这个自定义错误会作为任何来自该模式的验证问题的 message 属性显示。
所有 z 函数和模式方法均接受自定义错误。
如果愿意,也可以传入一个包含 error 参数的对象。
error 参数也可以接受一个函数。错误定制函数在 Zod 中称为 错误映射(error map)。如果发生验证错误,错误映射会在解析时运行。
错误映射会接收一个上下文对象,你可以根据验证问题来自定义错误信息。
对于高级场景,iss 对象提供了更多信息供你定制错误。
根据你使用的 API,可能会有其他可用属性。可以使用 TypeScript 的自动补全探索这些属性。
返回 undefined 以避免自定义错误消息,并回退到默认消息。(更具体地说,Zod 将控制权交给 优先级链 中的下一个错误映射。)这对于选择性地自定义某些错误消息而不自定义其他消息非常有用。
针对单次解析的错误定制
要针对每次解析定制错误,可以向解析方法 parse 传入错误映射:
这比模式级别的自定义消息优先级低。
iss 对象是所有可能的 issue 类型的区分联合类型。使用 code 属性区分它们。
详见所有 Zod issue 代码的拆解,参考 zod/v4/core 文档。
在 issue 中包含输入值
默认情况下,Zod 不会在 issues 中包含输入数据。这是为了防止无意中记录可能敏感的输入数据。要在每个 issue 中包含输入数据,请使用 reportInput 标志:
全局错误定制
要指定全局错误映射,使用 z.config() 设置 Zod 的 customError 配置选项:
全局错误消息的优先级低于模式级别或单次解析的错误消息。
iss 对象是所有可能的 issue 类型的区分联合类型。使用 code 属性区分它们。
详见所有 Zod issue 代码的拆解,参考 zod/v4/core 文档。
国际化
为支持错误信息的国际化,Zod 提供了多个内置语言包(locales)。它们从 zod/v4/core 包导出。
注意 — 常规的 zod 库会自动加载 en 语言环境。Zod Mini 默认不会加载任何语言环境,所有错误信息都默认为“输入无效”。
若想懒加载语言包,可以考虑动态导入:
为了方便,所有语言包作为 z.locales 从 "zod" 导出。在某些打包器中,这可能无法进行摇树优化。
语言包列表
可用语言包如下:
ar— 阿拉伯语az— 阿塞拜疆语be— 白俄罗斯语bg— 保加利亚语ca— 加泰罗尼亚语cs— 捷克语da— 丹麦语de— 德语en— 英语eo— 世界语es— 西班牙语fa— 波斯语fi— 芬兰语fr— 法语frCA— 加拿大法语he— 希伯来语hu— 匈牙利语hy— 亚美尼亚语id— 印度尼西亚语is— 冰岛语it— 意大利语ja— 日语ka— 格鲁吉亚语km— 高棉语ko— 韩语lt— 立陶宛语mk— 马其顿语ms— 马来语nl— 荷兰语no— 挪威语ota— 土耳其文ps— 普什图语pl— 波兰语pt— 葡萄牙语ro— 罗马尼亚语ru— 俄语sl— 斯洛文尼亚语sv— 瑞典语ta— 泰米尔语th— 泰语tr— 土耳其语uk— 乌克兰语ur— 乌尔都语uz— 乌兹别克语vi— 越南语zhCN— 简体中文zhTW— 繁体中文yo— 约鲁巴语
错误优先级
下面是确定错误优先级的快速参考:如果定义了多个错误定制,哪个优先?按从高到底优先级排序:
- 模式级错误 — 任何“硬编码”到模式定义中的错误消息。
- 单次解析错误 — 传入
.parse()方法的自定义错误映射。
- 全局错误映射 — 传给
z.config()的自定义错误映射。
- 语言包错误映射 — 传给
z.config()的语言包自定义错误映射。

