Typescript/Angular12 嵌套布尔枚举权限的结构定义与访问问题
错误原因
你当前代码报错的核心问题是类型定义顺序错误:TS在解析permissions类型时,permissionsEnum还未完成定义,导致TS无法识别枚举值为合法的索引key,进而触发索引类型不匹配的报错。此外代码还存在类型命名不规范、权限判断方法效率可优化的问题。
修正后的完整实现(完全符合仅定义一次权限名的需求)
第一步:定义类型(注意枚举要放在最前面)
// 优先定义权限枚举,仅在此处维护权限名称即可 export enum ProjectPermission { Read = "read", Write = "write", Delete = "delete" } // 用枚举作为key生成权限对象类型,新增权限时不需要修改此处 export type ProjectPermissions = { [key in ProjectPermission]: boolean; } // 项目实体接口 export interface Project { id: string; permissions: ProjectPermissions; }
第二步:修正权限判断方法
你原有代码用find需要遍历整个数组,用some方法匹配到符合条件的项就会终止遍历,性能更优,同时语法也更贴合布尔返回值的需求:
// 单权限判断方法 hasProjectRead(projectId: string): boolean { return this.projects.some(project => project.id === projectId && project.permissions[ProjectPermission.Read] ); }
推荐优化方案:通用权限判断方法
不需要为每个权限单独写判断函数,封装通用方法适配所有权限场景:
// 通用权限校验,传入项目ID和要校验的权限枚举即可 hasProjectPermission(projectId: string, permission: ProjectPermission): boolean { const targetProject = this.projects.find(project => project.id === projectId); // 项目不存在时默认返回无权限 return targetProject ? targetProject.permissions[permission] : false; } // 使用示例 const canWrite = this.hasProjectPermission('123', ProjectPermission.Write); const canDelete = this.hasProjectPermission('345', ProjectPermission.Delete);
内容的提问来源于stack exchange,提问作者user16831793
相关产品推荐
相关产品推荐

