ProgrammierungFullstack Entwickler

Erklären Sie den Unterschied zwischen den Typen never und void in TypeScript. Wann und warum sollten Sie jeden von ihnen verwenden?

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

Antwort.

void und never in TypeScript sind unterschiedliche Typen:

  • void wird normalerweise als Rückgabetyp für Funktionen verwendet, die nichts zurückgeben, d.h. die Funktion beendet die Ausführung, gibt aber keinen Wert zurück.
  • never bedeutet, dass die Funktion (oder der Ausdruck) niemals erfolgreich abgeschlossen wird: entweder wirft sie immer eine Ausnahme oder gibt niemals die Kontrolle zurück (zum Beispiel eine Endlosschleife).

Beispiele:

function log(message: string): void { console.log(message); } function throwError(message: string): never { throw new Error(message); } function infinite(): never { while (true) {} }

never wird häufig zur Kontrolle der Vollständigkeit von switch-case nach Typen verwendet:

type Shape = { kind: 'circle' } | { kind: 'square' }; function getArea(shape: Shape) { switch (shape.kind) { case 'circle': return 1; case 'square': return 2; default: const _exhaustive: never = shape; // Hier wird der Compiler darauf hinweisen, wenn ein Fall fehlt } }

Fangfrage.

Können void und never austauschbar als Rückgabetypen für Funktionen verwendet werden?

Antwort: Nein. Eine Funktion mit dem Typ void gibt undefined zurück oder gibt nichts zurück, aber sie beendet die Ausführung. Eine Funktion mit dem Typ never beendet niemals die Ausführung erfolgreich (wirft einen Fehler oder geht in eine Endlosschleife).

Beispiel:

const fn: () => never = () => { // return; // Fehler: Eine Funktion, deren deklarierter Typ 'never' ist, darf nicht zurückgeben. };

Geschichte

In einem analytischen System wurde die Validierungsfunktion mit dem Rückgabetyp void typisiert, obwohl sie immer eine Ausnahme auslöste. Infolgedessen glaubten die Entwickler, dass die Funktion "zurückkehren" konnte, und führten keine weiteren Überprüfungen durch, was dazu führte, dass die Fehlerbehandlung übersprungen wurde und die Aufrufkette falsch implementiert wurde.


Geschichte

In einem der TypeScript-Projekte wurde eine Funktion, die einen klar typisierten Rückgabetyp erwartete, als Rückgabewert never und nicht void definiert. Dadurch führte der Versuch, die Funktion mit einem als never typisierten Callback aufzurufen, zu Kompilierungsfehlern und Verlust der API-Kompatibilität.


Geschichte

Im Backend-Modul wurde früher eine Ausnahme über eine Funktion mit dem Rückgabetyp void ausgegeben. Nach der Migration zu TypeScript hat der Compiler nicht vor dem Verlassen des Codes nach dem Aufruf dieser Funktion gewarnt, was zu überflüssigen Zeilen "unerreichbaren" Codes führte – und nur die Änderung des Rückgabetyps auf never machte es möglich, solche Stellen zu erkennen und den Code sauberer zu gestalten und logische Fehler zu vermeiden.