You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:35:23