비동기 함수 유형을 정의하려고했지만 컴파일에 실패했습니다. 아래를 참조하십시오.
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 ''
}
}
누구든지이 문제를 해결할 수 있습니까?
답변
비동기 화살표 함수에 대해 “typedef”를 선언하는 방법을 검색했습니다.
함수의 반환 유형을 Promise로 선언하면 작동합니다.
interface SearchFn {
(subString: string): Promise<boolean>;
}
또는 유형 선언으로 :
type SearchFn = (subString: string) => Promise<boolean>;
Microsoft의 TS Linter는이 두 번째 구문을 권장합니다.
답변
async
키워드는 문제의 함수가 사용하는 컴파일러 / 런타임에 표시하는 데 사용됩니다 await
(이 필요한 넣을 수 있도록 내부 기능을 활성화 비계 ).
즉 , interface가 아니라 함수 구현async
에만 의미 가 있습니다 . 따라서 인터페이스의 메서드를 사용하는 것은 유용하지 않습니다. 함수가 특정 (귀하의 경우 )을 반환한다고 말하고 싶지만 인터페이스의 구현자가 특정 방식으로 (사용하여 ) 구현하도록 강요하고 싶지는 않습니다 .async
Promise
Promise<string>
await
그래서 다른 사람들이 내게 말했듯이 :
interface SearchFn {
(subString: string): Promise<string>;
}
그런 다음이 기능을 구현하기로 선택한 사람은 누구나 async
, 평범한 오래된 방법 Promise.then
또는 미래에 나올 새로운 방법론 을 사용할 수 있습니다 .
답변
반환 된 객체의 유형을 Promise 제네릭에 전달합니다.
type SearchFn = (subString: string): Promise<string>;
또는 AsyncFunction
제네릭 유형을 선언 할 수 있습니다 .
type AsyncFunction <A,O> = (...args:A) => Promise<O>
type SearchFn = AsyncFunction<[string], string>
AsyncFunction은 입력 유형 (A)과 출력 유형이라는 두 가지 유형 변수를받는 제네릭 유형입니다.