【发布时间】:2021-08-11 10:22:33
【问题描述】:
我有一个函数,其中某些输入属性取决于其中一个道具的值。所以我定义了一个类型如下,它按预期工作:
enum OrganizationPermission {
UPDATE = 'organization:update',
INVITE = 'organization:invite',
}
enum WorkspacePermission {
UPDATE = 'workspace:update',
INVITE = 'workspace:invite',
}
enum OrganizationRole {
MANAGER = 'manager'
}
enum WorkspaceRole {
MANAGER = 'manager'
}
type RolePermission = {
[OrganizationPermission.UPDATE]: {
organizationRole: OrganizationRole,
},
[OrganizationPermission.INVITE]: {
organizationRole: OrganizationRole,
},
[WorkspacePermission.UPDATE]: {
workspaceRole: WorkspaceRole,
},
}
type Permissions = WorkspacePermission | OrganizationPermission;
type CheckPermissionsArgs<P extends Permissions> = {
perform: P,
sustain?: boolean,
} & (P extends keyof RolePermission ? RolePermission[P] : Record<string, never>);
function checkPermissions<P extends Permissions>(props: CheckPermissionsArgs<P>): void {
// omitted for brevity
}
当我必须扩展这个道具时就会出现问题,如下例所示:
type CheckRolePermissionsArgs<P extends Permissions> = CheckPermissionsArgs<P> & {
role: string[],
}
function checkRolePermissions<P extends Permissions>({role, ...props}: CheckRolePermissionsArgs<P>): void {
// Typing error
checkPermissions(props);
}
Typescript 抱怨说:
TS2345:'Pick
类型的参数 , "执行" | “维持” | Exclude
), "role">>' 不可分配给类型为 'CheckPermissionsArgs 的参数 [“执行”]>'。键入'Pick
, "执行" | “维持” | Exclude
), "role">>' 不可分配给类型 'CheckRolePermissionsArgs ["perform"] 扩展了 OrganizationPermission | WorkspacePermission.UPDATE ? RolePermission[CheckRolePermissionsArgs<...>["perform"]] : Record<...>'
如何重构这些类型以避免在第二个示例中强制转换 props 参数?
【问题讨论】:
标签: typescript generics typing