基于值的打字稿动态类型

时间:2021-03-03 11:17:57

标签: reactjs typescript

在typesript中,我有一些代码来检查权限,例如:

enum Permission {
  CREATE = "CREATE",
  READ = "READ",
  UPDATE = "UPDATE",
  DELETE = "DELETE"
}

和基于传递的值的动态权限

export type DynamicPermissionProps = {
  [K in Permission]?: (...args: any[]) => boolean;
};

const DynamicPermission: DynamicPermissionProps = {
  [Permission.DELETE]: (owner: string): boolean => owner === "user-uuid",
  [Permission.UPDATE]: (moderators: string[]): boolean => moderators.indexOf("user-uuid") >= 0,
};

最后是一个用于检查能力的函数或组件,如

type AbilityProps = {
  permission: Permission,
  params: Parameters<typeof DynamicPermission[???permission???]> // ???permission??? is based on value
    //params: Parameters<typeof DynamicPermission[Permission.UPDATE]>;
}
                                              
const Ability = (props: AbilityProps) => {
    const {permission,params} = props;
        const ability: boolean =  perrmission in DynamicPermission && DynamicPermission[permission].apply(...params); //Call dynamic function with params
        return ability ? <div>Granted</div> : <div>Denied</div>
};                                              


https://tickvn.s3.ap-southeast-1.amazonaws.com/uPic/image-20210303180722629.png

所以,我不想问有什么解决方案可以检查AbilityProps中的类型,检查DynamicPermission中的交叉功能。类似https://www.typescriptlang.org/docs/handbook/utility-types.html#parameterstype

type AbilityProps<T extends Permissions, !!!V = ValueOf<T>!!! > = {
  permission: Permission,
  params: Parameters<typeof DynamicPermission[V]>
}
// if permission is Permission.DELETE return dynnmic function T1 = [owner: string]
// if permission is Permission.UPDATE return dynnmic function T2 = [moderators: string[]]
//...etc
 

这是代码https://codesandbox.io/s/permission-check-ts-1xkex

谢谢!

0 个答案:

没有答案