如何基于已有TypeScript联合类型创建映射后的新联合类型?
TypeScript联合类型映射优化方案
问题描述
现有如下联合类型:
type UserDtoRolesType = 'U' | 'C' | 'A';
需要基于该类型创建新的联合类型,映射规则为:'U' -> 'User'、'C' -> 'Customer'、'A' -> 'Admin',最终期望得到:
type UserRolesType = 'User' | 'Customer' | 'Admin';
当前采用嵌套条件类型实现,虽能得到预期结果,但写法繁琐、维护性差:
type TRoleConverter<R> = R extends 'U' ? 'User' : R extends 'C' ? 'Customer' : R extends 'A' ? 'Admin' : never; export type TUserRole = TRoleConverter<UserDtoRolesType>;
如何避免这种硬编码的嵌套条件判断,实现更合理的类型映射?
优化方案
可以通过映射类型+索引访问的方式实现,将映射关系集中定义,结构更清晰,维护更便捷:
// 原始联合类型 type UserDtoRolesType = 'U' | 'C' | 'A'; // 定义缩写与全称的映射关系 type RoleMap = { 'U': 'User', 'C': 'Customer', 'A': 'Admin' }; // 通过索引访问生成目标联合类型 type UserRolesType = RoleMap[UserDtoRolesType];
方案优势
- 映射关系集中管理,新增或修改角色时,只需在
RoleMap中添加/修改键值对即可,无需改动类型转换逻辑 - 代码结构简洁直观,相比嵌套条件类型更易读、易维护
内容的提问来源于stack exchange,提问作者Георгий Барсегян
相关产品推荐
相关产品推荐

