首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在TypeScript中将函数类型转换为异步类型?

如何在TypeScript中将函数类型转换为异步类型?
EN

Stack Overflow用户
提问于 2019-12-01 12:55:48
回答 1查看 606关注 0票数 1

如何在输入fn中键入此函数?

代码语言:javascript
复制
function makeAsync(fn) {
  return async (...args) => fn(...args);
}

它返回与其输入相同的函数,但不返回Type,而是返回Promise<Type>

用法示例:

代码语言:javascript
复制
const a = () => 1; // Type () => number;
const b = makeAsync(a); // Type () => Promise<number>;
const c = makeAsync(b); // Type () => Promise<number>; // ✅, not Promise<Promise<number>>

这个很好,但有点冗长

代码语言:javascript
复制
// 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>>;
代码语言:javascript
复制
function makeAsync<T extends (...args: any[]) => any>(fn: T): PromisedFunction<T> {
  return async (...args) => fn(...args);
}

TypeScript游乐场链接

是否有更好/更短的方法来实现这一目标?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-01 13:42:49

您可以通过为函数参数定义单独的类型参数AR和返回类型来稍微缩短类型,因此可以自动推断它们。然后,简单地将Promise包装在R in makeAsync2 (示例)中:

代码语言:javascript
复制
declare function makeAsync2<A extends any[], R>(fn: (...args: A) => R): (...args: A) => Promise<R>

const c = (arg1: number, arg2: string[]) => 1; // (arg1: number, arg2: string) => number
const d = makeAsync2(c); // (arg1: number, arg2: string[]) => Promise<number>
const cResult = c(3, ["s"]) // number
const dResult = d(3, ["s"]) // Promise<number>

编辑:

如果输入函数fn本身可以返回承诺,则可以将其返回类型设置为联合R | Promise<R>(示例):

代码语言:javascript
复制
function makeAsync2<A extends any[], R>(fn: (...args: A) => R | Promise<R>): (...args: A) => Promise<R> {
  return async (...args) => fn(...args);
}

const e = (arg1: string) => Promise.resolve(3) // (arg1: string) => Promise<number>
const f = makeAsync2(e); // (arg1: string) => Promise<number>
const eResult = e("foo") // Promise<number>
const fResult = f("foo") // Promise<number>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59125705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档