使用 Yup 在 TypeScript 中动态生成接口和验证模式

本文介绍如何在typescript项目中使用yup库动态生成接口和验证模式,尤其是在处理具有动态定义键的对象时,并确保至少一个键具有有效值。

使用 Yup 在 TypeScript 中动态生成接口和验证模式

挑战: 我们需要验证一个对象,其键是动态定义的,并且需要确保至少一个键的值有效。有效的键及其类型存储在一个元数据映射中:

const metadataMap = {  userId: Number,  utmSource: String,  utmMedium: String,  utmCampaign: String,};

登录后复制

解决方案: 我们分三个步骤解决这个问题:

步骤一:生成TypeScript接口

为了动态生成TypeScript接口,我们利用键入映射和keyof类型:

type Metadata = {  [k in keyof typeof metadataMap]?: typeof metadataMap[k] extends NumberConstructor ? number : string;};

登录后复制

这确保了Metadata接口会根据metadataMap的更新自动调整。生成的接口如下所示:

interface Metadata {  userId?: number;  utmSource?: string;  utmMedium?: string;  utmCampaign?: string;}

登录后复制

步骤二:动态生成Yup模式

我们使用object.keys和reduce方法动态创建Yup模式,将每个键映射到相应的Yup验证器:

const metadataSchema = yup.object().shape(  Object.keys(metadataMap).reduce((schema, key) => {    const type = metadataMap[key as keyof typeof metadataMap];    if (type === Number) {      schema[key] = yup.number().optional();    } else if (type === String) {      schema[key] = yup.string().optional();    }    return schema;  }, {} as Record));

登录后复制

这避免了硬编码,并确保模式会随着metadataMap的变化而自动更新。

步骤三:添加“至少一个键”规则

为了确保至少一个键具有有效值,我们在Yup模式中添加.test方法:

metadataSchema.test(  'atLeastOneKey',  'Metadata must have at least one valid key.',  (value) => {    if (!value || typeof value !== 'object') return false;    const validKeys = Object.keys(metadataMap) as (keyof typeof metadataMap)[];    return validKeys.some((key) => value[key] !== undefined);  });

登录后复制

这个测试会:

检查对象是否有效。从metadataMap动态获取有效键。验证至少一个键的值不为undefined。

结果:

以下示例展示了最终模式的行为:

const exampleMetadata = {  userId: undefined,  utmSource: 'Google',  extField: 'invalid', // This key is ignored};metadataSchema.validate(exampleMetadata)  .then(() => console.log('Validation successful!'))  .catch((err) => console.error('Validation failed:', err));

登录后复制

在这个例子中,验证成功,因为utmSource是一个有效键且值不为undefined,即使userId为undefined,extField也不在metadataMap中。 这个方法有效地结合了TypeScript的静态类型检查和Yup的运行时验证,提供了灵活且健壮的数据验证方案。

以上就是使用 Yup 在 TypeScript 中动态生成接口和验证模式的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2641826.html

(0)
上一篇 2025年3月7日 06:39:51
下一篇 2025年2月24日 02:42:08

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 我成为全栈开发人员的旅程

    大家好,我是Fabio,正在探索全栈Web开发的奇妙世界。在掌握编程基础后,我开启了全栈开发之旅,这是一段充满挑战但收获满满的旅程,我很高兴与大家分享我的心得体会。 我的学习历程: 我从 HTML、CSS和JavaScript 入门,深入理…

    2025年3月7日
    200
  • 测试数据管理工具:完整的指南

    高效软件测试的关键:测试数据管理工具 成功的软件测试策略离不开有效的测试数据管理。本文将深入探讨测试数据管理工具 (TDM) 如何简化这一过程。 什么是测试数据管理工具? TDM 工具是专门为软件测试环境的数据创建、维护和保护而设计的解决方…

    2025年3月7日
    200
  • 当Nestjs的Etest让我头疼

    nestjs 的 @processor 装饰器导致 e2e 测试失败的排查与解决 编写端到端 (E2E) 测试可能会很棘手,尤其当依赖的库或框架文档不足时。本文将探讨使用 NestJS 和 BullMQ 时,@Processor 装饰器导致…

    2025年3月7日
    200
  • JavaScript中的范围

    理解JavaScript作用域 JavaScript中的作用域定义了变量声明的上下文以及变量的可访问范围。清晰的作用域管理对于代码的正确运行和模块化至关重要,它直接影响代码行为以及不同代码段之间的交互。 JavaScript主要包含两种作用…

    2025年3月7日
    200
  • 理解JavaScript中的变量:LET,CONST和VAR解释了

    变量是编程中的基石,它们像数据容器一样存储信息。JavaScript提供了三种声明变量的方式:var、let和const。虽然表面上看起来相似,但它们在用途和行为上存在显著差异。本文将深入探讨let、const和var之间的区别,并通过实际…

    2025年3月7日
    200
  • 人工智能工具市场

    AIprophetic.com 网站文章列表: 2025年: 2025-01-24: 人工智能工具市场概览 (https://www.php.cn/link/1c52486ff0b2a44fbfefeb15d21f53ae)2025-01-…

    2025年3月7日
    200
  • 扩展 WebSocket 的经验教训

    随着对同步引擎和实时功能的需求不断增长,websocket 已成为现代应用程序的关键组件。在 compose,websocket 构成了我们服务的支柱,为我们的后端 sdk 提供支持,使开发人员能够仅使用后端代码来交付低延迟的交互式应用程序…

    2025年3月7日
    200
  • 正在为 JavaScript 苦苦挣扎?读这个

    还在为JavaScript学习而苦恼?本文将为您提供快速掌握JavaScript的有效方法,助您摆脱学习困境。 JavaScript学习的常见难题 许多学习者在学习JavaScript过程中都会遇到以下问题: 信息过载: JavaScrip…

    2025年3月7日
    200
  • Nextjs 15 中的动态文档标题

    Next.js 15 简化了文档标题管理,允许直接在 JSX 中使用 标签。 工作原理 Next.js 15 允许您在 JSX 中直接嵌入 标签。 Next.js 利用其服务器端渲染 (SSR) 和客户端水合功能,在组件重新渲染时自动更新文…

    2025年3月7日
    200
  • 了解JavaScript操作员:从算术到三元

    本文深入探讨JavaScript运算符的方方面面。 JavaScript运算符涵盖多种类型: 算术运算符: +、-、*、/、%、**一元运算符: -(负号)、! (逻辑非)比较运算符: >、=、逻辑运算符: &&(与)…

    2025年3月7日
    200

发表回复

登录后才能评论