[typescript] 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 ''
    }
}

누구든지이 문제를 해결할 수 있습니까?



답변

비동기 화살표 함수에 대해 “typedef”를 선언하는 방법을 검색했습니다.

함수의 반환 유형을 Promise로 선언하면 작동합니다.

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

또는 유형 선언으로 :

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

Microsoft의 TS Linter는이 두 번째 구문을 권장합니다.


답변

async키워드는 문제의 함수가 사용하는 컴파일러 / 런타임에 표시하는 데 사용됩니다 await(이 필요한 넣을 수 있도록 내부 기능을 활성화 비계 ).

즉 , interface가 아니라 함수 구현async 에만 의미 가 있습니다 . 따라서 인터페이스의 메서드를 사용하는 것은 유용하지 않습니다. 함수가 특정 (귀하의 경우 )을 반환한다고 말하고 싶지만 인터페이스의 구현자가 특정 방식으로 (사용하여 ) 구현하도록 강요하고 싶지는 않습니다 .asyncPromisePromise<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)과 출력 유형이라는 두 가지 유형 변수를받는 제네릭 유형입니다.


답변