I have a function takes takes an arbitrary async function and returns the result of awaiting that async function, but wrapped in a try/catch which adds some additional logic. See ts playground.
const with401Redirection = <T extends (...args: any[]) => Promise<any>>( call: T ): ((...args: Parameters<T>) => ReturnType<T>) => // @ts-expect-error async (...args: Parameters<T>): ReturnType<T> => { try { return await call(...args); } catch (error) { if ((error as any).httpStatus === 401) { // do some stuff here } throw error; } }; interface User { id: string; name: string; } interface ItemPayload { field1: string; field2: string; } interface ItemResponse { id: string; field1: string; field2: string; } const client = { get<ResponseType>(url: string): Promise<ResponseType> { // logic to hit server and return result here return '' as any; }, post<ResponseType>(url: string, body: Record<string, any>): Promise<ResponseType> { // logic to hit server and return result here return '' as any; } }; const getUser = with401Redirection(() => client.get<User>('url_1') ); const saveItem = with401Redirection((body: ItemPayload) => client.post<ItemResponse>('url_2', body) ); I feel like the // @ts-expect-error in with401Redirection shouldn't be necessary -- how can I remove it or generally clean up the typing of the with401Redirection function? Keep in mind I want to maintain the fact that the getUser and saveItem functions have their types automatically inferred for me.