本文旨在介绍如何在 Zod 中实现类似 Yup 的 setLocale 功能,即自定义验证错误信息以支持国际化(i18n)。通过 z.setErrorMap 方法,您可以全局设置自定义错误映射,从而根据不同的错误类型和上下文返回相应的本地化错误信息。此外,我们还将介绍 zod-i18n 库,这是一个专门为 Zod 设计的 i18n 解决方案,可以更方便地集成 i18next 等 i18n 库。
Zod 是一个流行的 TypeScript 优先的模式声明和验证库。与 Yup 类似,Zod 允许您定义数据模式并验证数据是否符合这些模式。虽然 Zod 没有像 Yup 那样直接的 setLocale 方法,但它提供了 z.setErrorMap 方法,允许您自定义验证错误信息,从而实现类似的功能。
使用 z.setErrorMap 自定义错误信息
z.setErrorMap 接受一个函数作为参数,该函数接收两个参数:issue 和 ctx。issue 包含了有关验证错误的详细信息,例如错误代码、期望的类型等。ctx 包含了验证上下文,例如默认的错误信息。
以下是一个使用 z.setErrorMap 自定义错误信息的示例:
import { z } from "zod"; const customErrorMap: z.ZodErrorMap = (issue, ctx) => { if (issue.code === z.ZodIssueCode.invalid_type) { if (issue.expected === "string") { return { message: "必须是字符串类型" }; } if (issue.expected === "number") { return { message: "必须是数字类型" }; } } if (issue.code === z.ZodIssueCode.too_small) { if (issue.type === "string") { return { message: `字符串长度不能小于 ${issue.minimum}` }; } } return { message: ctx.defaultError }; }; z.setErrorMap(customErrorMap); const schema = z.object({ name: z.string().min(3), age: z.number(), }); const result = schema.safeParse({ name: "ab", age: "abc" }); if (!result.success) { console.log(result.error.format()); }
在这个例子中,我们定义了一个名为 customErrorMap 的函数,该函数根据不同的错误代码返回不同的错误信息。例如,如果类型无效且期望的类型是字符串,则返回 “必须是字符串类型” 错误信息。如果字符串太短,则返回包含最小长度的错误信息。
集成 zod-i18n 实现国际化
zod-i18n 是一个专门为 Zod 设计的 i18n 库,它依赖于 i18next。使用 zod-i18n 可以更方便地实现 Zod 模式的国际化。
以下是一个使用 zod-i18n 的示例:
import i18next from "i18next"; import { z } from "zod"; import { zodI18nMap } from "zod-i18n-map"; import translation from "zod-i18n-map/locales/zh-CN/zod.json"; // 导入中文翻译 i18next.init({ lng: "zh-CN", resources: { "zh-CN": { zod: translation }, }, }); z.setErrorMap(zodI18nMap); const schema = z.string().email(); try { schema.parse("foo"); } catch (error) { if (error instanceof z.ZodError) { console.log(error.errors[0].message); // 输出: 必须是有效的电子邮件地址 } }
在这个例子中,我们首先初始化 i18next,并加载中文翻译文件。然后,我们将 zodI18nMap 设置为 Zod 的错误映射。最后,当我们尝试解析一个无效的电子邮件地址时,Zod 会返回一个本地化的错误信息。
注意事项
- 确保正确配置 i18next 并加载正确的翻译文件。
- zod-i18n 提供了多种语言的翻译文件,您可以根据需要选择合适的翻译文件。
- 您可以自定义 zod-i18n 提供的翻译文件,以满足您的特定需求。
总结
通过 z.setErrorMap 方法,您可以自定义 Zod 的验证错误信息,从而实现类似 Yup 的 setLocale 功能。zod-i18n 库提供了一个更方便的解决方案,可以轻松地将 Zod 集成到您的 i18n 工作流程中。选择哪种方法取决于您的具体需求和偏好。
评论(已关闭)
评论已关闭