У меня есть функция, в которой некоторые свойства ввода зависят от значения одного из его свойств. Итак, я определил тип следующим образом, и он работает, как ожидалось:
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: Argument of type 'Pick<CheckRolePermissionsArgs
, "perform" | "sustain" | Exclude<keyof (P extends OrganizationPermission | WorkspacePermission.UPDATE ? RolePermission[P] : Record<...>), "role">>' is not assignable to parameter of type 'CheckPermissionsArgs<CheckRolePermissionsArgs
["perform"]>'. Type 'Pick<CheckRolePermissionsArgs
, "perform" | "sustain" | Exclude<keyof (P extends OrganizationPermission | WorkspacePermission.UPDATE ? RolePermission[P] : Record<...>), "role">>' is not assignable to type 'CheckRolePermissionsArgs
["perform"] extends OrganizationPermission | WorkspacePermission.UPDATE ? RolePermission[CheckRolePermissionsArgs<...>["perform"]] : Record<...>'
Как мне провести рефакторинг этих типизаций, чтобы избежать использования аргумента props
во втором примере?