首页 > web前端 > js教程 > 正文

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

聖光之護
发布: 2025-08-12 21:24:23
原创
848人浏览过

使用 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 工作流程中。选择哪种方法取决于您的具体需求和偏好。

以上就是使用 Zod 实现类似 Yup 的 setLocale 功能的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号