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

时间:2016-08-03 12:48:21

标签: 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 ''
    }
}

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

4 个答案:

答案 0 :(得分:59)

发现这个搜索如何为异步箭头函数声明“typedef”。

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

interface SearchFn {
    (subString: string): Promise<boolean>;
}

或作为一种类型的退出:

type SearchFn = (subString: string) => Promise<boolean>;

答案 1 :(得分:2)

您可以声明一个通用类型,然后根据需要重新使用它。

type AsyncFunction <I,O> = (inputs:I) => Promise<O> 

AsyncFunction是一种类型泛型,它接收两个类型变量-输入的类型和输出的类型。

以下是如何使用它的示例:

const getPrice: AsyncFunc<string,number> = 
    async (url) => {
        const response = await fetch(url)
        const data = await response.json()
        return data.price
    }

答案 2 :(得分:1)

async关键字用于向编译器/运行时指示相关函数将在内部使用await(以便可以将其放入所需的scaffolding to enable it中)。

这意味着async仅对函数的实现有意义,而不是界面。因此,在接口的方法上使用async并没有用,您想说该函数返回某个Promise(在您的情况下为Promise<string>),但是您不想强制执行该操作接口的实现者以某种方式(使用await来实现)。

就像其他人在我面前说的那样:

interface SearchFn {
    (subString: string): Promise<string>;
}

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

答案 3 :(得分:0)

简单方法。

export interface SignUpReturn {
  user_id: string
  platform: string
  name: string
  image_url: string
  email: string
}

export interface SignUpType {
  platform: string
  loginId: string
  password: string
  name: string
  email: string
}

const SignUp = async (userInfo: SignUpType) => {
  try {
    const data: SignUpReturn = await client.request(query, userInfo)
    return data
  } catch (error) {
    throw error
  }
}

export default SignUp

或没有类型定义

const SignUp = async (userInfo: SignUpType): Promise<SignUpReturn> => {
  try {
    const data: SignUpReturn = await client.request(query, userInfo)
    return data
  } catch (error) {
    throw error
  }
}