我试图定义一种异步函数,但编译失败,见下文:
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 ''
}
}
任何人都可以帮我解决这个问题吗?
答案 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
}
}