在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
谢谢!