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

Mah*_*Ali 16 javascript typescript

考虑我们有一个如下所示的函数

const upper = (str: string) : string => string.toUpperCase() 
Run Code Online (Sandbox Code Playgroud)

我们可以使用以下方法获取函数的类型ReturnType

type Test = ReturnType<typeof upper>
Run Code Online (Sandbox Code Playgroud)

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

const getUserData = async (uid: string): Promise<{name: string, email: string}> => {
   ...
};
Run Code Online (Sandbox Code Playgroud)

现在我们怎样才能得到这种类型{name: string, email: string}

for*_*d04 20

您可以AsyncReturnType使用以下命令创建infer

type AsyncReturnType<T extends (...args: any) => Promise<any>> =
    T extends (...args: any) => Promise<infer R> ? R : any
Run Code Online (Sandbox Code Playgroud)

测试:

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

type T1 = AsyncReturnType<typeof getUserData> // { name: string; email: string; }
Run Code Online (Sandbox Code Playgroud)

样本

  • 对于 TS v4.5,您可以使用:`导出类型 AsyncReturnType&lt;T extends (..._args: any) =&gt; Promise&lt;any&gt;&gt; = Awaited&lt;ReturnType&lt;T&gt;&gt;;` (7认同)

Alu*_*dad 10

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

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

export type ValueType<T> =
  T extends Promise<infer U>
    ? U
    : T;
Run Code Online (Sandbox Code Playgroud)

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

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

type UserData = ValueType<ReturnType<typeof getUserData>>;
Run Code Online (Sandbox Code Playgroud)