本文介绍如何在typescript项目中使用yup库动态生成接口和验证模式,尤其是在处理具有动态定义键的对象时,并确保至少一个键具有有效值。
挑战: 我们需要验证一个对象,其键是动态定义的,并且需要确保至少一个键的值有效。有效的键及其类型存储在一个元数据映射中:
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