在TypeScript中建模权限树

在TypeScript中建模权限树,typescript,permissions,typing,Typescript,Permissions,Typing,我正在尝试对权限树进行建模,如下所示(JSON): (当然,域_1,其他域代表实际的业务域,如客户等) 我可以这样键入这个对象:constpermissiontree:{[domain:string]:{[type:string]:boolean};。但是,我尝试做一些更严格的事情,并产生了以下代码: enum PermissionArea { DOMAIN_1 = 'DOMAIN_1', DOMAIN_2 = 'DOMAIN_2', ... } enum Permis

我正在尝试对权限树进行建模,如下所示(JSON):

(当然,域_1,其他域代表实际的业务域,如客户等)

我可以这样键入这个对象:
constpermissiontree:{[domain:string]:{[type:string]:boolean};
。但是,我尝试做一些更严格的事情,并产生了以下代码:

enum PermissionArea {
    DOMAIN_1 = 'DOMAIN_1',
    DOMAIN_2 = 'DOMAIN_2',
    ...
}

enum PermissionType {
    CREATE = 'CREATE',
    READ = 'READ',
    EDIT = 'EDIT',
    DELETE = 'DELETE'
}

type PermissionsTree = {
    [key in PermissionArea]: { [type in PermissionType]: boolean };
};

export class Permission {
    public static create(area: PermissionArea, type: PermissionType): string {
        return `${area}.${type}`;
    }
}

const isPermission = (x: any): x is Permission => {
    if (typeof x !== 'string') {
        return false;
    }

    const keys = x.split('.');

    if (keys.length !== 2) {
        return false;
    }

    return keys[0] in PermissionArea && keys[1] in PermissionType;
};
虽然这似乎比第一种方法更好,但并不理想。首先,我的
权限
实际上是一个
字符串
,每当我想使用方法时,比如
拆分
,我都需要将类型指定为字符串或强制转换它。这违背了键入它的目的,如下面的示例所示(错误将出现在运行时,而不是编译时):

此外,创建权限有点冗长,这是一个使用示例:

const AUTH_ROUTES: AuthenticatedRoute[] = [
    ...
    {
        path: '/users',
        component: <Users/>,
        permissions: [Permission.create(PermissionArea.USER, PermissionType.READ)]
    },
    ...

const AUTH_ROUTES:AuthenticatedRoute[]=[
...
{
路径:'/users',
组成部分:,
权限:[权限.创建(PermissionArea.USER,PermissionType.READ)]
},
...
您对如何在JSON中保持权限树不变的情况下改进这些输入有什么建议吗

const isAuthorized = (
    permission: string,
    userPermissions: PermissionsTree
): boolean | undefined => {
    if (!isPermission(permission)) {
        throw new Error(`${permission} is not an allowed permission!`);
    } else {
        return userPermissions[getPermissionArea(permission)][getPermissionType(permission)];
    }
};

const AUTH_ROUTES: AuthenticatedRoute[] = [
    ...
    {
        path: '/users',
        component: <Users/>,
        permissions: [Permission.create(PermissionArea.USER, PermissionType.READ)]
    },
    ...