2017-05-08 23 views
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 

回答

2

你可以讓父類通用:

class Permissions<T extends string> { 
    ... 

    hasPermission(actionName: T) { 
     ... 
    } 
} 

然後:

class AdminPermissions extends Permissions<AdminActions> { ... } 

class UserPermissions extends Permissions<UserActions> { ... } 

編譯器會抱怨這樣的:

user.hasPermission('Add User'); 

說:

參數類型的「‘添加用戶’」是不能分配給 類型的參數「UserActions」

正如你想要的。

code in playground

+0

這是完美的!正是我在找什麼。 – user553086

相關問題