TypeScript中如何用单个类型声明表示所有角色权限类型?
问题描述
我有一个对象,其中包含若干角色,每个角色对应一组权限数组,示例如下:
const allRoles = { user: [ 'right1' ], admin: [ 'right1', 'right2' ], } as const
如果要分别获取user和admin的权限类型,可以这么写:
type userRights = Array<typeof allRoles.user[number]> type adminRights = Array<typeof allRoles.admin[number]>
要拿到这两种权限的联合类型,写法是:
type RoleRights = userRights | adminRights
我不想单独定义每个角色的权限类型,能不能用单个类型声明直接表示所有可用的权限类型?就像我用下面这段代码生成包含所有权限的数组那样:
const roleRights = new Map(Object.entries(allRoles))
解决方案
完全可以,直接遍历allRoles的所有值类型就能生成联合权限类型,不用单独定义每个角色的权限类型。
单个类型声明实现所有权限的联合类型
type RoleRights = Array<typeof allRoles[keyof typeof allRoles][number]>
代码解释
keyof typeof allRoles:获取allRoles对象的所有键类型,也就是'user' | 'admin'typeof allRoles[keyof typeof allRoles]:拿到所有角色对应的权限数组类型,即typeof allRoles['user'] | typeof allRoles['admin'][number]:提取数组里的元素类型,得到所有权限的联合类型'right1' | 'right2'- 最后用
Array<>包裹,就得到了所有可能的权限数组类型的联合,和分开定义再联合的效果一模一样。
如果只需要所有权限值的联合类型(不是数组类型),去掉外层的Array<>就行:
type AllRightValues = typeof allRoles[keyof typeof allRoles][number]
这样得到的就是'right1' | 'right2'的类型。
内容的提问来源于stack exchange,提问作者OultimoCoder
相关产品推荐
相关产品推荐

