在TypeScript中建模权限树
我正在尝试对权限树进行建模,如下所示(JSON): (当然,域_1,其他域代表实际的业务域,如客户等) 我可以这样键入这个对象:在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
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)]
},
...