ProgrammierungFullstack-Entwickler

Wie funktioniert die Typisierung von asynchronen Funktionen und Promise in TypeScript? Wie beschreibt man sicher die Rückgabewerte, fängt Typisierungsfehler ab und wo liegt der Unterschied zu normalen Funktionen? Geben Sie Beispiele an.

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

In TypeScript geben asynchrone Funktionen (async/await) immer ein Promise zurück. Der Typ des Rückgabewertes wird so angegeben: Promise<Type>. Bei der Beschreibung der Funktion ist es wichtig, das Ergebnis explizit zu typisieren, damit TypeScript korrekt mit den Typen innerhalb des Promises arbeitet. Typisierungsfehler können auftreten, wenn die Zwischenwerte nicht mit den deklarierten übereinstimmen.

Asynchrone Funktion:

async function fetchUser(id: number): Promise<User> { const response = await fetch(`/api/user/${id}`); const data: User = await response.json(); return data; }

Wenn die Funktion einen Fehler oder eine Ablehnung zurückgeben soll, sollte der Typ des Promises den Fehler nicht direkt beschreiben (Promise<Error>), da die Ablehnung des Promises nicht typisiert wird, sondern über catch abgefangen wird.

Die Typisierung von Promise-Ketten ist wichtig:

function getNumber(): Promise<number> { return Promise.resolve(42); } getNumber().then(val => val.toFixed(2)); // TypeScript weiß, dass val eine Zahl ist

Fangfrage.

Frage: Kann eine asynchrone Funktion etwas anderes als ein Promise zurückgeben?

Antwort: Nein. Eine asynchrone Funktion gibt immer ein Promise-Objekt zurück. Wenn explizit ein Nicht-Promis zurückgegeben wird, wird der Rückgabewert automatisch von TypeScript in ein Promise gewickelt.

async function test() { return 1; } const result = test(); type ResultType = typeof result; // Promise<number>

Beispiele für reale Fehler aufgrund mangelnden Wissens über die Feinheiten des Themas.


Geschichte

Ein Entwickler schrieb eine Funktion ohne explizite Typisierung des Rückgabewertes in der Annahme, dass sie ein Objekt eines bestimmten Typs zurückgibt. Mit der Änderung der Logik wurde die Funktion so umgeschrieben, dass ein anderer Typ zurückgegeben wurde, und das wurde nicht sofort bemerkt, da TypeScript basierend auf der Typableitung keinen Fehler ausgab. Letztendlich traten die Fehler erst zur Laufzeit auf, als der Verbraucher der Funktion versuchte, auf eine nicht existierende Eigenschaft zuzugreifen.


Geschichte

In einem Projekt waren die Promise-Ketten nicht typisiert. Der Versuch, auf eine nicht existierende Methode des Ergebnisses zuzugreifen, führte zu Fehlern. So wurde das Ergebnis then(response => response.data) als any betrachtet, und der Fehler beim Zugreifen auf Felder oder Methoden zeigte sich erst zur Laufzeit. Der Fehler ging in die Produktion und wurde nur durch die Benutzer entdeckt.


Geschichte

Die asynchrone Funktion wurde mit dem Typ Promise<Error> deklariert, in der Annahme, dass dies die Fehlererfassung ermöglichen würde, aber tatsächlich wurden die Fehler nicht über throw weitergegeben und das Promise wurde mit einem anderen Werttyp abgelehnt. Dies führte zu einer stillschweigenden Vermischung von Fehlern und gültigen Werten und zu Bugs in der Logik der Verarbeitung von Promise-Ergebnissen.