2

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.

1 Answer 1

5

Try this:

TS Playground link

type Awaited<T> = T extends PromiseLike<infer U> ? Awaited<U> : T; type AsyncFn = (...args: any[]) => Promise<any>; function with401Redirection <T extends AsyncFn>(call: T): (...args: Parameters<T>) => Promise<Awaited<ReturnType<T>>> { return async (...args: Parameters<T>) => { try { return await call(...args); } catch (exception) { if (typeof exception === 'object' && (exception as any)?.httpStatus === 401) { // do some stuff here } throw exception; } }; } 

Read about the actual, upcoming Awaited type in TS 4.5:

https://devblogs.microsoft.com/typescript/announcing-typescript-4-5-beta/#the-awaited-type-and-promise-improvements

Sign up to request clarification or add additional context in comments.

2 Comments

How could I make this work if I want to chain nested async function wrappers?
^ @David Please ask a new question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.