如何获取打字稿中异步函数的返回类型?

时间:2020-01-16 17:02:42

标签: javascript typescript

考虑一下我们具有如下功能

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}

2 个答案:

答案 0 :(得分:2)

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

我们可以使用条件类型来提取承诺将解决的值的类型。

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>>;

答案 1 :(得分:1)

您可以使用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; }

Sample