Как я могу набрать эту функцию относительно ее ввода fn
?
function makeAsync(fn) {
return async (...args) => fn(...args);
}
Она возвращает функцию, идентичную ее вводу, но вместо возврата Type
она вернет Promise<Type>
Пример использования:
const a = () => 1; // Type () => number;
const b = makeAsync(a); // Type () => Promise<number>;
const c = makeAsync(b); // Type () => Promise<number>; // ✅, not Promise<Promise<number>>
Это работает, но немного многословно
// Unwraps a Promise<T> value into just T, so we never get Promise<Promise<T>>
type Unpromise<MaybePromise> = MaybePromise extends Promise<infer Type> ? Type : MaybePromise;
// Like ReturnType, except it returns the unwrapped promise also for async functions
type AsyncReturnType<T extends (...args: any[]) => any> = Unpromise<ReturnType<T>>
// For a `() => T` function it returns its async equivalent `() => Promise<T>`
type PromisedFunction<T extends (...args: any[]) => any> =
(...args: Parameters<T>) => Promise<AsyncReturnType<T>>;
function makeAsync<T extends (...args: any[]) => any>(fn: T): PromisedFunction<T> {
return async (...args) => fn(...args);
}
TypeScript Playground link
Есть ли лучшие / более короткие способы достижения этого?