1
我正在嘗試創建子類來處理應用程序的不同區域的權限。每個子類都有他們處理的有效操作的不同列表,以及我們在不允許操作時顯示的各種原因。我試圖在父類上定義一個hasPermissions
方法來檢查是否啓用了權限,但是如果我傳入的字符串不是當前實例的有效操作,我希望它發出抱怨。父類如何根據子類來確定將哪種類型傳遞給方法?
我知道我可以通過在每個子類上定義hasPermissions
來處理這個問題,即hasPermissions (actionName: UserActions) { ... }
,但我希望避免這種情況。父類可以根據當前實例確定允許哪些操作嗎?
declare var _;
type TPermission<TAction, TReason> = {
action: TAction;
enabled: boolean;
reason?: TReason;
}
class Permissions {
constructor(protected permissions) {
}
hasPermission(actionName) {
let permission = _.find(this.permissions, {
action: actionName
});
return permission ? permission.enabled : false;
}
}
type AdminActions = 'Add User' | 'Delete User';
type AdminReasons = 'MaxUsersReached' | 'CantDeleteAnotherAdmin';
type TAdminPermission = TPermission<AdminActions, AdminReasons>;
class AdminPermissions extends Permissions {
protected permissions: TAdminPermission[];
constructor(permissions: TAdminPermission[]) {
super(permissions);
}
}
type UserActions = 'Subscribe' | 'Unsubscribe';
type UserReasons = 'AlreadySubscribed' | 'AlreadyUnsubscribed';
type TUserPermission = TPermission<UserActions, UserReasons>;
class UserPermissions extends Permissions {
protected permissions: TUserPermission[];
constructor(permissions: TUserPermission[]) {
super(permissions);
}
}
let permissions: TUserPermission[] = [
{
action: 'Subscribe',
enabled: true
}
];
let user = new UserPermissions(permissions);
user.hasPermission('Subscribe'); // Valid, should return true
user.hasPermission('Unsubscribe'); // Valid, should return false
user.hasPermission('Add User'); // Invalid permission for UserPermissions, should error
這是完美的!正是我在找什麼。 – user553086