W maszynie, jak zdefiniować typ funkcji asynchronicznej


93

Próbowałem zdefiniować typ funkcji asynchronicznej, ale kompilacja nie powiodła się, patrz poniżej:

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 ''
    }
}

Czy ktoś może mi pomóc rozwiązać to?


Promise <boolean> nie działa?
— toskv

Pokaż, jak / gdzie definiujesz Fn.

Odpowiedzi:


168

Znalazłem to wyszukiwanie, jak zadeklarować „typedef” dla asynchronicznej funkcji strzałkowej.

Działa, jeśli po prostu zadeklarujesz typ zwracanej funkcji jako Obietnicę:

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

lub jako deklaracja typu:

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

Microsoft TS Linter zaleci tę drugą składnię.


3
Sprytnie, dziękuję, async func w rzeczywistości jest funkcją zwracaną przez Promise.
— Ron

@Ron warto wspomnieć, że nie jest poprawny, funkcja async po prostu używa await. Zobacz odpowiedź Mottiego
— Code Novitiate

Należy pamiętać, że funkcja, która zwraca obietnicę, niekoniecznie jest funkcją asynchroniczną.
— liaguridio

1
co jeśli nie ma zwróconej wartości? ): Promise<undefined>zawodzi dla mnie. Potrzebuję tylko funkcji asynchronicznej, aby móc korzystać z awaitniej ...
— dcsan

3
@dcsan Promise <void>
— Thiago Barcala

25

Słowo asynckluczowe służy do wskazania kompilatorowi / środowisku wykonawczemu, że dana funkcja będzie używana awaitwewnętrznie (aby można ją było umieścić w wymaganym rusztowaniu, aby ją włączyć ).

Oznacza to, że asyncma znaczenie tylko dla wykonania funkcji, a nie dla jej interfejsu . Dlatego posiadanie asyncmetody interfejsu nie jest przydatne, chcesz powiedzieć, że funkcja zwraca pewien Promise(w twoim przypadku Promise<string>), ale nie chcesz wymuszać, że implementator interfejsu implementuje to w określony sposób (używając await).

Więc jak powiedział inny przede mną:

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

Wtedy każdy, kto zdecyduje się zaimplementować tę funkcję, może wybrać asynczwykłą starą, Promise.thena może nawet nową metodologię, która pojawi się w przyszłości.


1
Świetna odpowiedź i zwięźle wyjaśnia „dlaczego”.
— Code Novitiate

8

Przekaż typ zwróconego obiektu do generycznej Promise.

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

Alternatywnie możesz zadeklarować AsyncFunctiontyp ogólny.

type AsyncFunction <A,O> = (...args:A) => Promise<O> 
type SearchFn = AsyncFunction<[string], string>

AsyncFunction to typ ogólny, który odbiera dwie zmienne typu - typ wejścia (A) i typ danych wyjściowych.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.