In Typoskript, wie man den Typ der asynchronen Funktion definiert


84

Ich habe versucht, eine Art asynchrone Funktion zu definieren, bin jedoch bei der Kompilierung fehlgeschlagen (siehe unten):

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

Kann mir jemand helfen, das herauszufinden?


Versprechen <boolean> funktioniert nicht?
— toskv

Bitte zeigen Sie, wie / wo Sie definieren Fn.

Antworten:


156

Fand diese Suche, wie man ein "typedef" für eine asynchrone Pfeilfunktion deklariert.

Es funktioniert, wenn Sie nur den Rückgabetyp der Funktion als Versprechen deklarieren:

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

oder als Typdeklaration:

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

Microsoft TS Linter wird diese zweite Syntax empfehlen.


3
Smart, danke, async func ist tatsächlich eine von Promise zurückgegebene Funktion.
— Ron

@ Ron erwähnenswert, dass dies nicht korrekt ist. Die asynchrone Funktion verwendet einfach "Warten". Siehe Mottis Antwort
— Code Novitiate

Die Leute sollten beachten, dass eine Funktion, die ein Versprechen zurückgibt, nicht unbedingt eine asynchrone Funktion ist.
— Liaguridio

1
Was ist, wenn kein Wert zurückgegeben wird? ): Promise<undefined>scheitert für mich. Ich brauche nur eine asynchrone Funktion, damit ich sie verwenden awaitkann ...
— dcsan

2
@dcsan Promise <void>
— Thiago Barcala

21

Das asyncSchlüsselwort wird verwendet, um dem Compiler / der Laufzeit anzuzeigen, dass die betreffende Funktion awaitintern verwendet wird (damit sie das erforderliche Gerüst einsetzen kann, um sie zu aktivieren ).

Dies bedeutet, dass dies asyncnur für die Implementierung der Funktion von Bedeutung ist, nicht für die Schnittstelle . Daher asyncist es nicht sinnvoll, die Methode einer Schnittstelle zu verwenden. Sie möchten sagen, dass die Funktion eine bestimmte Promise(in Ihrem Fall Promise<string>) zurückgibt, aber Sie möchten nicht erzwingen, dass der Implementierer der Schnittstelle dies auf eine bestimmte Weise implementiert (using await).

Also wie andere vor mir sagten:

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

Wer sich dann für die Implementierung dieser Funktion entscheidet, kann wählen, ob er eine asyncalte Promise.thenoder vielleicht sogar eine neue Methode verwenden möchte, die in Zukunft auftauchen wird.


1
Tolle Antwort und erklärt kurz und bündig das "Warum".
— Code Novitiate

7

Übergeben Sie den Typ des zurückgegebenen Objekts an das Promise-Generikum.

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

Alternativ können Sie einen AsyncFunctiongenerischen Typ deklarieren .

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

AsyncFunction ist ein generischer Typ, der zwei Typvariablen empfängt - den Typ der Eingabe (A) und den Typ der Ausgabe.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.