angular - 如何“正确”检查属性名称与它的值?
问题描述
我有以下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>
我的问题是 - 我怎样才能混合字符串枚举和类属性,以便:
- 强制
checkPermission
成为一种类型(例如,Permission
而不是)string
- 使代码可读且美观?
一个幻想的解决方案,用英文写的:
User
类扩展Permission
了具有所有身份验证定义的枚举。通过扩展该枚举,User
将每个枚举成员添加为属性。
谢谢!
解决方案
一种方法可能是将您的 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);
这样添加权限对我来说似乎更容易,并且可以在任何地方使用枚举来检查权限。
推荐阅读
- ruby-on-rails - Rails 6.1.4.1:证书验证失败(无法获取本地颁发者证书)(OpenSSL::SSL::SSLError)
- c - GCC C:是否存在调用 __attribute__(cleanup) 函数的等价于 exit() 的函数?
- excel - Powershell,Excel搜索文件夹
- python - 在 FLASK 中,有没有办法在页面打开时运行 python 函数?
- apache-spark - 在 PySpark 中重命名重复的列名或对其执行选择操作
- mysql - MySQL如何四舍五入?
- python - 在 django 中引导消息
- c# - 如何使用 C# 将标题添加到 csv 文件?
- vb.net - 需要帮助解决 HTTP GET 请求中的错误
- clojurescript - 如何从 go 块返回一个承诺?