TypeScript枚举在函数中的应用:权限枚举扩展与多权限组合解析函数实现求助
解决TypeScript枚举权限组合解析问题
嘿,我来帮你搞定这个枚举权限的问题!先拆解下你原代码里的核心问题,再一步步给出修正方案。
原代码的问题点
- 数组未初始化:你声明了
let arr: string[]但没赋值,直接调用push会抛出Cannot read properties of undefined错误,必须初始化为空数组[]。 - 遍历对象错误:你直接遍历传入的
permission(比如3这种组合值),而不是遍历Permission枚举本身。TypeScript数字枚举编译后是双向映射对象(既有Read:1也有1:"Read"),遍历数字只会拿到索引,完全不是你需要的枚举成员。 - 缺少权限判断逻辑:你没有用位运算判断组合值里包含哪些权限,直接把所有枚举成员塞进数组,这完全不符合需求。
正确实现方案
你的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
相关产品推荐
相关产品推荐

