首页 > 解决方案 > 如何“正确”检查属性名称与它的值?

问题描述

我有以下User课程:

export class User {
    public id: number;

    //Some basic information
    public email: string;
    public firstName: string;
    public lastName: string;

    //Permissions - what matters for my question
    public canHangSocks: boolean;
    public canDrinkEggnot: boolean;
    public canReachMistletoe: boolean;
    public canSleepWhileSantaInChimney: boolean;
}

disabled我创建了一个指令,用于根据每个对应的权限设置操作按钮的状态:

@Directive({
  selector: '[checkPermission]'
})
export class ActionButtonCheckerDirective {
  private currentUser: User;
  @Input() checkPermission: string;

  constructor(
    private host: NbActionComponent,
    private rootStore: Store<ApplicationState>
  ) { }

  ngOnInit() {
    this.rootStore.pipe(select(fromApp.getCurrentUser).subscribe((user: User) => {
      this.currentUser = user;
      this.host.disabled = this.validateUserPermission(this.checkPermission);
    });
  }

  validateUserPermission(permissionName: string): boolean {
    return !this.currentUser[permissionName];
  }
}

执行:

<nb-action checkPermission="canHangSocks" nbTooltip="Hang Socks"></nb-action>

我的问题是 - 我怎样才能混合字符串枚举和类属性,以便:

  1. 强制checkPermission成为一种类型(例如,Permission而不是)string
  2. 使代码可读且美观?

一个幻想的解决方案,用英文写的:

User类扩展Permission 了具有所有身份验证定义的枚举。通过扩展该枚举, User将每个枚举成员添加为属性。

谢谢!

标签: angulartypescript

解决方案


一种方法可能是将您的 User 拆分为这样的泛型和权限,然后您可以使用“keyof”类型:

class UserPermissions {
  canHangSocks: boolean;
  canDrinkEggnot: boolean;
  canReachMistletoe: boolean;
  canSleepWhileSantaInChimney: boolean;
}

export class User extends UserPermissions {
  public id: number;
  public email: string;
  public firstName: string;
  public lastName: string;
}

const fn = (perm: keyof UserPermissions) => {};

我更喜欢在我的用户中使用私有权限数组并直接在用户中实现检查功能:


enum Permissions {
  canHangSocks = 'canHangSocks',
  canDrinkEggnot = 'canDrinkEggnot',
  canReachMistletoe = 'canReachMistletoe',
  canSleepWhileSantaInChimney = 'canSleepWhileSantaInChimney',
}

class User {
  public id: number;
  public email: string;
  public firstName: string;
  public lastName: string;

  private permissions: Permissions[] = [];

  public hasPermission(permission: Permissions) {
    return this.permissions.includes(permission);
  }
}

userInstance.hasPermission(Permissions.canHangSocks);

这样添加权限对我来说似乎更容易,并且可以在任何地方使用枚举来检查权限。


推荐阅读