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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:54:02