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

TypeScript枚举在函数中的应用:权限枚举扩展与多权限组合解析函数实现求助

解决TypeScript枚举权限组合解析问题

嘿,我来帮你搞定这个枚举权限的问题!先拆解下你原代码里的核心问题,再一步步给出修正方案。

原代码的问题点

  1. 数组未初始化:你声明了let arr: string[]但没赋值,直接调用push会抛出Cannot read properties of undefined错误,必须初始化为空数组[]。
  2. 遍历对象错误:你直接遍历传入的permission(比如3这种组合值),而不是遍历Permission枚举本身。TypeScript数字枚举编译后是双向映射对象(既有Read:1也有1:"Read"),遍历数字只会拿到索引,完全不是你需要的枚举成员。
  3. 缺少权限判断逻辑:你没有用位运算判断组合值里包含哪些权限,直接把所有枚举成员塞进数组,这完全不符合需求。

正确实现方案

你的Permission枚举定义是对的,用2的幂作为值非常适合位运算组合权限。接下来修改getPermissionList函数,核心思路是遍历枚举的所有有效成员,用位运算判断该成员是否存在于传入的组合值中,再收集对应的名称。

enum Permission {
  Read = 1,
  Write = 2,
  Execute = 4,
}

function getPermissionList(permission: Permission): string[] {
  const permissionNames: string[] = [];
  
  // 遍历Permission枚举的所有键
  for (const key in Permission) {
    // 过滤掉反向映射的数字键(比如"1"、"2"这类)
    if (!isNaN(Number(key))) continue;
    
    // 获取当前枚举成员对应的值
    const currentPermission = Permission[key as keyof typeof Permission];
    
    // 位运算判断:组合值包含当前权限则加入结果数组
    if ((permission & currentPermission) !== 0) {
      permissionNames.push(key);
    }
  }
  
  return permissionNames;
}

// 测试用例
console.log(getPermissionList(Permission.Read | Permission.Write)); // 输出 ['Read', 'Write']
console.log(getPermissionList(Permission.Execute)); // 输出 ['Execute']
console.log(getPermissionList(Permission.Read | Permission.Write | Permission.Execute)); // 输出 ['Read', 'Write', 'Execute']

关键代码解释

  • 过滤数字键:!isNaN(Number(key))用来跳过枚举反向生成的数字键(比如"1"对应"Read"),只保留我们定义的Read、Write这些字符串键。
  • 位运算判断权限:permission & currentPermission是位与操作,若结果不为0,说明传入的组合值包含当前权限。比如3(1|2)&1结果是1≠0,说明包含Read;3&4结果是0,说明不包含Execute。
  • 类型断言:key as keyof typeof Permission让TypeScript识别key是Permission枚举的有效键,避免类型报错。

这样修改后,函数就能正确解析权限组合值,返回对应的权限名称数组啦!

内容的提问来源于stack exchange,提问作者LeaveKamAlone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 11:47:28