在typescript中,如何定义异步函数的类型

Ron*_*Ron 41 typescript

我试图定义一种异步函数,但编译失败,见下文:

interface SearchFn {
    async (subString: string): string;
}

class A {
    private Fn: SearchFn
    public async do():Promise<string> {
        await this.Fn("fds") // complain here: cannot invoke an expression whose type lacks a call signature
        return ''
    }
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我解决这个问题吗?

Thi*_*ala 89

找到这个搜索如何为异步箭头函数声明"typedef".

如果你只是将函数的返回类型声明为Promise,它就可以工作:

interface SearchFn {
    (subString: string): Promise<boolean>;
}
Run Code Online (Sandbox Code Playgroud)

或作为一种类型的退出:

type SearchFn = (subString: string) => Promise<boolean>;
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案 (7认同)
  • @dcsan 承诺&lt;void&gt; (6认同)
  • 聪明,谢谢, async func 实际上是一个 Promise 返回函数。 (3认同)

Mot*_*tti 43

async关键字用于向编译器/运行时指示相关函数将在await内部使用(因此它可以放入所需的脚手架以启用它)。

这意味着async它只对函数的实现有意义,而不是它的interface。因此,async拥有接口的方法没有用,您想说该函数返回某个Promise(在您的情况下Promise<string>),但您不想强制接口的实现者以某种方式(使用await)实现它。

所以正如其他人在我之前所说:

interface SearchFn {
    (subString: string): Promise<string>;
}
Run Code Online (Sandbox Code Playgroud)

然后,选择实现此功能的任何人都可以选择使用async,简单的旧Promise.then方法,甚至可能是将来会出现的一些新方法。

  • 很好的答案,并简洁地解释了“为什么”。 (4认同)
  • 不完全的。标记为“async”的函数也会返回 Promise。所以 `async function x() { return true; }` 返回 `Promise&lt;boolean&gt;` 类型。就我个人而言,我认为 Typescript 团队在这里搞砸了,应该允许在模板中使用异步来指示方法返回承诺。但没有人问我。;) (4认同)

Ben*_*arp 11

将返回对象的类型传递给 Promise 泛型。

type SearchFn = (subString: string): Promise<string>;
Run Code Online (Sandbox Code Playgroud)

或者,您可以声明一个AsyncFunction泛型类型。

type AsyncFunction <A,O> = (...args:A) => Promise<O> 
type SearchFn = AsyncFunction<[string], string>
Run Code Online (Sandbox Code Playgroud)

AsyncFunction 是一个类型泛型,它接收两个类型变量——输入(A)的类型和输出的类型。