如何在typescript中获取异步函数的返回类型?

15
考虑我们有一个如下的函数。
const upper = (str: string) : string => string.toUpperCase() 

我们可以使用 ReturnType 来获取函数的类型。

type Test = ReturnType<typeof upper>

但是,现在考虑我们有一个异步函数。

const getUserData = async (uid: string): Promise<{name: string, email: string}> => {
   ...
};

现在我们如何获得这种类型 {name: string, email: string}


等待Promise解决后再进行检查吗? getUserData().then(data => { checkit(data) }; - JDunken
我不知道,但是搜索结果显示了这个问题,看起来非常相关。 - ASDFGerte
我觉得这个更好:https://dev59.com/nVcP5IYBdhLWcg3wHmxU#50924506 - Alex Biro
2个回答

19

您可以使用infer来创建AsyncReturnType

type AsyncReturnType<T extends (...args: any) => Promise<any>> =
    T extends (...args: any) => Promise<infer R> ? R : any

测试:

const getUserData = async (uid: string): Promise<{ name: string, email: string }> => {...};

type T1 = AsyncReturnType<typeof getUserData> // { name: string; email: string; }

示例


5
针对 TS v4.5,你可以使用以下代码: export type AsyncReturnType<T extends (..._args: any) => Promise<any>> = Awaited<ReturnType<T>>; 其中,“AsyncReturnType”是一个类型别名,其定义了由泛型函数类型参数“T”返回的 Promise 对象的解构结果类型,并且这个解构结果类型是通过 Awaited 型别辅助工具类型对“ReturnType<T>”进行处理得到的。 - Mahmoud

10

被标记为 async 的函数返回类型是 Promise<T>

我们可以使用条件类型来提取 promise 将解析的值的类型。

export type ValueType<T> =
  T extends Promise<infer U>
    ? U
    : T;

然后我们可以将这种类型与 ReturnType 组合,以获得所需的结果。

const getUserData = async (uid: string): Promise<{name: string, email: string}> => {
   ...
};

type UserData = ValueType<ReturnType<typeof getUserData>>;

谢谢你的回答,很棒。但是我会接受其他人的回答,因为它更容易使用。 - Maheer Ali
1
没问题。记住,另一个答案默认为任何类型,这对类型安全性不利。 - Aluan Haddad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接