Der Typ never in TypeScript: So beheben Sie den Fehler "not assignable to parameter"

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum schreit TypeScript bei einem leeren Array?

\n\n

Haben Sie jemals TypeScript-Code geschrieben, die Kompilierung gestartet und als Antwort eine rätselhafte Meldung erhalten: "Argument of type 'X' is not assignable to parameter of type 'never'"? Falls ja, sind Sie nicht allein. Dieser Fehler ist ein echter Stolperstein für Entwickler aller Erfahrungsstufen. Auf Stack Overflow hat diese Frage tausende Aufrufe gesammelt, und heute werden wir sie ein für alle Mal klären.

\n\n

Stellen Sie sich die Situation vor: Sie deklarieren ein leeres Array, versuchen etwas hinzuzufügen, und TypeScript blockiert die Operation. Kommt Ihnen bekannt vor? Lassen Sie uns verstehen, warum das passiert und, vor allem, wie man es behebt.

\n\n

In diesem Artikel übersetzen wir nicht nur die trockene Dokumentation. Wir gehen den Weg vom Auftreten des Fehlers bis zu seiner vollständigen Behebung mit realen Beispielen, die Sie sofort in Ihren Projekten anwenden können.

\n\n

Was ist der Typ never in TypeScript?

\n\n

Bevor wir in die Tiefen der Fehler eintauchen, lassen Sie uns den Typ never selbst verstehen. In TypeScript bezeichnet dieser Typ "einen Wert, den es nicht geben kann". Das klingt philosophisch, ist aber in der Praxis einfach:

\n\n
    \n
  • never ist der Typ für Funktionen, die niemals enden (Endlosschleife) oder immer eine Exception werfen.
  • \n
  • never ist der "Boden" des Typsystems. Sie können never allem zuweisen, aber nichts kann never zugewiesen werden (außer never selbst).
  • \n
\n\n

Stellen Sie sich nun vor, TypeScript sieht ein leeres Array und weiß nicht, welche Elemente darin sein werden. Im Modus der strengen Typisierung (strict: true in tsconfig.json) zieht der Compiler eine logische Schlussfolgerung: "Wenn das Array leer ist und der Typ nicht angegeben wurde, kann nichts darin sein – der Elementtyp ist never".

\n\n
// Beispiel: TypeScript leitet den Typ als never[] ab\nconst emptyArray = [];\nemptyArray.push("hello"); // Fehler!\n// Argument of type 'string' is not assignable to parameter of type 'never'\n
\n\n

Da ist er, der berüchtigte Fehler. TypeScript warnt ehrlich: "Du hast gesagt, das Array kann nur never enthalten, versuchst aber, einen String hinzuzufügen. So nicht!"

\n\n

Hauptszenarien für das Auftreten des Fehlers

\n\n

1. Leeres Array ohne Typannotation

\n\n

Der häufigste Fall. Ein Entwickler erstellt ein leeres Array, plant, es später zu füllen, vergisst aber, den Typ anzugeben.

\n\n
// ❌ Problem\nconst items = []; // TypeScript leitet ab: any[] (wenn strict: false) oder never[] (wenn strict: true)\nitems.push({ id: 1, name: "Alice" }); // Fehler bei strict: true\n\n// ✅ Lösung: Geben Sie den Typ explizit an\nconst items: Array<{ id: number; name: string }> = [];\nitems.push({ id: 1, name: "Alice" }); // Funktioniert!\n
\n\n

2. Array-Methoden, die never zurückgeben (filter, reduce)

\n\n

Die Methode filter mit einem falschen Prädikat oder reduce ohne Startwert können zur Ableitung des Typs never führen.

\n\n
// ❌ Problem mit filter\nconst numbers: (number | null)[] = [1, null, 2, null, 3];\nconst onlyNumbers = numbers.filter(item => item !== null); \n// TypeScript kann den Typ als (number | null)[] oder sogar never[] ableiten, wenn das Prädikat "kaputt" ist\n\n// ✅ Lösung: Verwenden Sie einen Type Guard\nconst onlyNumbersSafe: number[] = numbers.filter((item): item is number => item !== null); \n\n// ❌ Problem mit reduce\nconst result = [1, 2, 3].reduce((acc, val) => acc + val); \n// Fehler! TypeScript kennt den Starttyp des Akkumulators nicht\n\n// ✅ Lösung: Geben Sie einen Startwert an\nconst resultSafe = [1, 2, 3].reduce((acc, val) => acc + val, 0); // Funktioniert!\n
\n\n

3. Generics und Bedingte Typen

\n\n

Ein komplexerer Fall – wenn TypeScript den Typ aufgrund komplexer Verallgemeinerungen nicht ableiten kann.

\n\n
// ❌ Problem\nfunction getFirstElement<T>(arr: T[]): T | undefined {\n  return arr[0];\n}\n\nfunction processItems<T>                

Blogs

Buchempfehlungen