boxmoe_header_banner_img

Hello! 欢迎来到悠悠畅享网!

文章导读

使用 Zod 实现类似 Yup 的 setLocale 功能


avatar
站长 2025年8月12日 3

使用 Zod 实现类似 Yup 的 setLocale 功能

本文旨在介绍如何在 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 工作流程中。选择哪种方法取决于您的具体需求和偏好。



评论(已关闭)

评论已关闭