Website-Suche

TypeScript - Warum ist() => Promise zu() => void zuweisbar?


Warum führt das nicht zu einem Compilerfehler?

function foo(): () => void {
    return () => Promise.resolve();
}

Dieser spezielle Fall ist wichtig, weil der Aufrufer, wenn eine Funktion ein Versprechen zurückgibt, wissen sollte, dass die Funktion nicht „fertig“ ist, bis das Versprechen erfüllt oder abgelehnt wird.

Promises hängen damit zusammen, warum dies ein Problem im Codebase ist, das ich mir anschaue, aber es scheint, dass die Kombination von void und Funktionstypen im Allgemeinen eine besondere Behandlung erfährt, die ich nicht verstehe. Warum würde die erste Zeile im Folgenden einen Fehler verursachen, aber nicht die zweite Zeile?

const y: void = 3;             // error
const x: () => void = () => 3; // OK

Missverstehe ich das Phänomen? Ist das ein TypeScript-Fehler?

Antwort #1

Als eine einfache Begründung: Wenn Sie () => void als Callback-Typ verwenden, bedeutet das, dass Sie einfach keinen Rückgabewert erwarten.

Du willst einfach eine Funktion ausführen, die kein Argument benötigt.

Also, da man normalerweise auch Funktionen aufrufen kann, die etwas zurückgeben, und dann einfach den zurückgegebenen Wert ignoriert, folgt daraus, dass jede Funktion, die etwas zurückgibt, anstelle einer als void gekennzeichneten Funktion verwendet werden könnte.

Es könnte aus der Sicht anderer Sprachen überraschend sein, in denen der zurückgegebene Typ für die Kompilierung eine Rolle spielt. Bedenken Sie jedoch, dass TypeScript seine Wurzeln in JavaScript hat, und dort eine Funktion, die „nichts“ zurückgibt ( function f() { return; }), tatsächlich sowieso undefined zurückgibt. Aus dieser Sicht geben also alle JS-Funktionen irgendwie etwas zurück.

Hier ist eine ähnliche Erklärung direkt aus den TypeScript-FAQ:

Eine andere Möglichkeit, dies zu betrachten, ist, dass ein Callback-Typ, der void zurückgibt, sagt: „Ich werde mir deinen Rückgabewert nicht ansehen, falls einer existiert“.

Also bedeutet void hier „keine Einschränkung des Rückgabetyps“.

Wenn Sie stattdessen irgendeinen zurückgegebenen Typ verbieten möchten, verwenden Sie () => undefined, das ist der minimale Typ, der sowieso zurückgegeben wird, selbst von einer void-Funktion.

Verwandte Artikel