typescript 如何基于另一个联合体创建联合体类型?

qgelzfjb  于 2023-03-19  发布在  TypeScript
关注(0)|答案(2)|浏览(126)

我是工会会员

type UserDtoRolesType = 'U' | 'C' | 'A';

我希望基于UserDtoRolesType“U”-〉“用户”创建新联合类型|“C”-〉“客户”|“A”-〉“管理员”*
我想得到的:

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>;

这给出了期望的结果,但看起来很麻烦,也不正确。有没有可能避免硬编码这一点,并获得一个新的联合类型?

juud5qan

juud5qan1#

您可以使用Indexed Access Types来存档以下内容:

type UserDtoRolesType = 'U' | 'C' | 'A';

type UserRoleMap = {
  U:'User',
  C:'Customer',
  A:'Admin'
}

export type TUserRole = UserRoleMap[UserDtoRolesType];
rkttyhzu

rkttyhzu2#

您可以像下面这样稍微简化代码,但是我不确定是否有其他方法可以改进解决方案。

type UserRolesType = 
  UserDtoRolesType extends infer R 
    ? R extends 'U' ? 'User' 
    : R extends 'C' ? 'Customer' 
    : R extends 'A' ? 'Admin' 
    : never 
    : never;

相关问题