📋Spickzettel
Die wichtigste Syntax auf einen Blick. Jedes Snippet wird in den Tests der App mit dem echten Compiler fehlerfrei übersetzt.
🧱 Grundlagen
Variablen
let n: number = 1; const s = "abc"; // Typ: "abc" let liste: string[] = []; let paar: [string, number] = ["a", 1];
Objekte
interface Punkt { readonly x: number; y?: number; } type Id = string | number;
Funktionen
function f(a: number, b = 2, c?: string): string { return String(a + b) + (c ?? ""); } const g = (x: number): boolean => x > 0; type Fn = (x: number) => void;
Rest & Überladung
function summe(...z: number[]) { return z.reduce((a, b) => a + b, 0); } function p(x: string): number; function p(x: number): string; function p(x: string | number) { return typeof x === "string" ? Number(x) : String(x); }
🔗 Typen kombinieren
Union & Intersection
type A = string | number; type B = { a: 1 } & { b: 2 };
Literal & as const
type Modus = "hell" | "dunkel"; const FARBEN = ["rot", "blau"] as const; type Farbe = (typeof FARBEN)[number];
satisfies
const k = { port: 80 } satisfies Record<string, number>; k.port.toFixed(); // bleibt number
keyof & typeof
const nutzer = { id: 1, name: "Ada" }; type Nutzer = typeof nutzer; type Schluessel = keyof Nutzer; // "id" | "name" type Name = Nutzer["name"]; // string
🔎 Narrowing
Wächter
function f(x: string | number | Date | null) { if (x === null) return; if (typeof x === "string") x.trim(); else if (x instanceof Date) x.getTime(); else x.toFixed(); }
Type Guard & asserts
function istText(x: unknown): x is string { return typeof x === "string"; } function sicher(x: unknown): asserts x is number { if (typeof x !== "number") throw new Error(); }
Exhaustiveness
type S = "a" | "b"; function f(s: S) { switch (s) { case "a": return 1; case "b": return 2; default: const n: never = s; return n; } }
🧬 Generics
Funktion & Constraint
function erstes<T>(l: T[]): T | undefined { return l[0]; } function lies<T, K extends keyof T>(o: T, k: K): T[K] { return o[k]; }
Klasse & Default
class Box<T = unknown> { constructor(public inhalt: T) {} } const b = new Box("x"); // Box<string>
🧰 Utility Types
Objekte umbauen
interface U { id: number; name: string; mail?: string } type A = Partial<U>; type B = Required<U>; type C = Readonly<U>; type D = Pick<U, "id">; type E = Omit<U, "id">; type F = Record<"a" | "b", number>;
Unions & Funktionen
type G = Exclude<"a" | "b" | "c", "a">; type H = Extract<string | number, number>; type I = NonNullable<string | null>; type J = ReturnType<() => number>; type K = Parameters<(a: string) => void>; type L = Awaited<Promise<number>>;
🧮 Typ-Programmierung
Mapped Type
type Nullbar<T> = { [K in keyof T]: T[K] | null }; type Getter<T> = { [K in keyof T as `get${Capitalize<string & K>}`]: () => T[K]; };
Conditional & infer
type IstText<T> = T extends string ? true : false; type Element<T> = T extends (infer E)[] ? E : never;
Template Literal
type Ereignis = `on${Capitalize<"klick" | "fokus">}`; type Px = `${number}px`;
🏛️ Klassen
Modifikatoren
abstract class Tier { #id = 1; // echt privat (JS) private p = 0; // nur Compiler protected name = ""; readonly art: string = "Tier"; abstract laut(): string; }
implements
interface Laut { laut(): string } class Hund implements Laut { laut() { return "Wuff"; } }
🛠️ Werkzeuge
Befehle
// npm i -D typescript // npx tsc --init tsconfig.json anlegen // npx tsc übersetzen // npx tsc --noEmit nur prüfen // npx tsc -w beobachten // node datei.ts Type Stripping (Node ≥ 22.18 / 23.6) // npx tsx datei.ts ausführen mit tsx export {};
🚨Fehlercodes auf Deutsch
Die häufigsten Meldungen des Compilers – jedes Beispiel löst genau diesen Fehler aus (geprüft in den Tests).
| Code | Bedeutung | Lösung | Beispiel |
|---|---|---|---|
| TS1294 Syntax nicht „löschbar“ (erasableSyntaxOnly) | Mit erasableSyntaxOnly sind nur Konstrukte erlaubt, die sich durch reines Entfernen der Typen in JavaScript verwandeln lassen. enum, namespace mit Code und Parameter-Properties erzeugen Laufzeit-Code – Node.js mit Type Stripping kann sie nicht ausführen. | Union von Literalen bzw. as const-Objekt statt enum, normale Felder statt Parameter-Properties. | enum Farbe { Rot, Gruen } |
| TS1360 `satisfies` nicht erfüllt | Der Ausdruck vor satisfies passt nicht zum angegebenen Typ. Anders als eine Annotation behält satisfies aber den genauen (engeren) Typ des Werts. | Wert oder erwarteten Typ korrigieren. | const port = "8080" satisfies number; |
| TS2304 Name nicht gefunden | Ein Bezeichner ist weder deklariert noch importiert – oft ein Tippfehler oder ein vergessener Import. | Tippfehler prüfen, deklarieren oder importieren. | console.log(gesamtSumme); |
| TS2307 Modul nicht gefunden | Ein Import verweist auf ein Paket oder eine Datei, zu der der Compiler weder Code noch Typdeklarationen findet. | Paket installieren, Pfad prüfen oder Typen nachrüsten (npm i -D @types/paket) bzw. eine eigene .d.ts mit declare module "paket" anlegen. | import { rechne } from "rechner-lib"; |
| TS2322 Typ nicht zuweisbar | Ein Wert wird einer Variablen, Eigenschaft oder einem Rückgabewert zugewiesen, dessen Typ ihn nicht zulässt. Der Quelltyp (links in der Meldung) ist keine Teilmenge des Zieltyps. | Wert korrigieren, den Zieltyp erweitern (z. B. string | number) oder vorher umwandeln (String(x), Number(x)). Bei Objekten nennt die Meldung darunter die Eigenschaft, die nicht passt. | let alter: number = "42"; |
| TS2339 Eigenschaft existiert nicht | Auf eine Eigenschaft wird zugegriffen, die der Typ nicht kennt. Häufig bei Unions: die Eigenschaft gibt es nur bei einem Teil der Union. | Tippfehler prüfen, den Typ um die Eigenschaft erweitern oder vorher mit in, typeof bzw. einem Diskriminator eingrenzen. | const punkt = { x: 1, y: 2 };
console.log(punkt.z); |
| TS2341 Private Eigenschaft | Auf ein mit private markiertes Klassenmitglied wird von außen zugegriffen. Achtung: private gilt nur zur Compile-Zeit – für echte Kapselung zur Laufzeit gibt es #feld. | Eine öffentliche Methode anbieten oder das Mitglied public/protected machen. | class Tresor {
private code = "beispiel-passwort";
}
console.log(new Tresor().code); |
| TS2344 Typargument verletzt die Einschränkung | Ein generischer Typparameter hat eine Einschränkung (T extends …), und das übergebene Typargument erfüllt sie nicht. | Passendes Typargument wählen oder die Einschränkung lockern. | type NurObjekte<T extends object> = T; type X = NurObjekte<string>; |
| TS2345 Argument passt nicht zum Parameter | Beim Funktionsaufruf hat ein Argument einen Typ, den der Parameter nicht akzeptiert – der Zuweisungsfehler (TS2322) speziell für Aufrufe. | Argument umwandeln oder prüfen (Narrowing), bevor die Funktion aufgerufen wird – oder die Signatur der Funktion anpassen. | function verdopple(n: number) { return n * 2; }
verdopple("21"); |
| TS2352 Fragwürdige Typumwandlung mit `as` | as ändert nur die Sicht des Compilers, nicht den Wert. Überschneiden sich die Typen gar nicht, lehnt TypeScript die Behauptung ab. | Den Wert wirklich umwandeln (Number(s)) oder prüfen. Der Umweg as unknown as T schaltet die Prüfung ab – nur mit gutem Grund. | const eingabe = "42"; const zahl = eingabe as number; |
| TS2353 Unbekannte Eigenschaft im Objektliteral | Excess Property Check: Ein *frisches* Objektliteral enthält eine Eigenschaft, die der Zieltyp nicht kennt. Strukturell wäre das erlaubt – bei Literalen deutet es aber fast immer auf einen Tippfehler hin. | Tippfehler beheben oder die Eigenschaft in den Typ aufnehmen. (Über eine Zwischenvariable würde die Prüfung nicht greifen – das ist Absicht, keine Lösung.) | interface Optionen { farbe: string }
const o: Optionen = { farbe: "rot", groesse: "L" }; |
| TS2355 Funktion gibt nichts zurück | Der deklarierte Rückgabetyp verlangt einen Wert, die Funktion enthält aber gar kein return mit Wert. | Wert zurückgeben oder den Rückgabetyp auf void ändern. | function summe(a: number, b: number): number {
console.log(a + b);
} |
| TS2365 Operator passt nicht zu den Typen | Ein Operator wie <, > oder + wird auf Typen angewendet, für die er nicht definiert ist. | Werte vorher umwandeln oder vergleichbare Eigenschaften verwenden (z. B. a.getTime() < b.getTime()). | const a = { wert: 1 };
const b = 2;
console.log(a < b); |
| TS2366 Rückgabe fehlt auf einem Pfad | Die Funktion hat einen Rückgabetyp ohne undefined, aber nicht jeder Pfad endet mit return. | Fehlenden Fall ergänzen (z. B. default: im switch) oder am Ende einen Wert zurückgeben bzw. einen Fehler werfen. | function vorzeichen(n: number): string {
if (n > 0) return "+";
if (n < 0) return "-";
} |
| TS2367 Vergleich ohne Überschneidung | Zwei Werte werden verglichen, deren Typen sich nicht überschneiden – das Ergebnis wäre immer false. Oft ein Tippfehler bei Literal-Typen. | Den Vergleichswert korrigieren (z. B. "aktiv" statt "aktive") oder den Typ erweitern. | type Status = "aktiv" | "inaktiv";
function pruefe(s: Status) {
return s === "gesperrt";
} |
| TS2420 Klasse erfüllt Interface nicht | Eine Klasse behauptet mit implements, ein Interface zu erfüllen, es fehlt aber etwas oder ein Typ passt nicht. | Fehlende Mitglieder implementieren; die Meldung darunter nennt sie. | interface Form { flaeche(): number }
class Kreis implements Form {
radius = 1;
} |
| TS2445 Geschützte Eigenschaft (protected) | Ein protected-Mitglied ist nur in der Klasse selbst und in Unterklassen sichtbar, nicht von außen. | Zugriff über eine öffentliche Methode oder das Mitglied public machen. | class Konto {
protected stand = 0;
}
console.log(new Konto().stand); |
| TS2454 Variable vor Zuweisung verwendet | Die Kontrollflussanalyse erkennt, dass eine Variable auf einem Pfad gelesen wird, bevor sie einen Wert bekommen hat. | Variable bei der Deklaration initialisieren oder auf jedem Pfad zuweisen. | let ergebnis: number; if (Math.random() > 0.5) ergebnis = 1; console.log(ergebnis); |
| TS2532 Objekt ist möglicherweise `undefined` | Ältere, allgemeinere Form von TS18048: Ein Ausdruck ohne eigenen Namen (z. B. ein Array-Element) könnte undefined sein. | Wert zuerst in eine Variable holen und prüfen oder ?. verwenden. | const liste: number[][] = []; console.log(liste.at(0)[0]); |
| TS2540 Schreibgeschützte Eigenschaft | Die Eigenschaft ist readonly (auch durch Readonly<T> oder as const) und darf nach der Erzeugung nicht mehr geändert werden. | Ein neues Objekt erzeugen ({ ...alt, x: 2 }) statt zu verändern – oder readonly entfernen, falls Änderungen gewollt sind. | interface Punkt { readonly x: number }
const p: Punkt = { x: 1 };
p.x = 2; |
| TS2551 Eigenschaft existiert nicht – meinten Sie …? | Wie TS2339, aber der Compiler hat eine ähnlich geschriebene Eigenschaft gefunden und schlägt sie vor. | Meist ein Tippfehler – den Vorschlag übernehmen. | const text = "hallo"; text.toUppercase(); |
| TS2554 Falsche Anzahl von Argumenten | Die Funktion erwartet eine andere Anzahl von Argumenten. Anders als JavaScript prüft TypeScript das genau. | Argumente ergänzen/entfernen oder Parameter optional machen (x?: T) bzw. einen Standardwert geben (x = 1). | function addiere(a: number, b: number) { return a + b; }
addiere(1); |
| TS2561 Unbekannte Eigenschaft – meinten Sie …? | Wie TS2353 (Excess Property Check), aber der Compiler kennt eine ähnlich geschriebene Eigenschaft und fragt, ob diese gemeint war. | Tippfehler korrigieren – der Vorschlag steht am Ende der Meldung. | interface Optionen { farbe: string }
const o: Optionen = { frabe: "rot" }; |
| TS2564 Klassen-Eigenschaft nicht initialisiert | Mit strictPropertyInitialization muss jede Eigenschaft ohne undefined im Typ im Konstruktor einen Wert bekommen. | Direkt initialisieren, im Konstruktor zuweisen, | undefined ergänzen oder – wenn ein Framework sie setzt – name!: string. | class Konto {
inhaber: string;
} |
| TS2588 Zuweisung an Konstante | Eine mit const deklarierte Variable kann nicht neu zugewiesen werden (in JavaScript ein Laufzeitfehler, in TypeScript schon beim Schreiben). | let verwenden, wenn sich der Wert ändern soll. | const zaehler = 0; zaehler = 1; |
| TS2591 Name nicht gefunden – Typen für Node fehlen | Ein bekannter Node.js-Name wie process, require oder Buffer ist unbekannt, weil die Typdeklarationen fehlen. Der Compiler schlägt @types/node vor. | npm i -D @types/node und in tsconfig.json "types": ["node"] eintragen – seit TypeScript 6.0 ist types standardmäßig leer, @types-Pakete werden nicht mehr automatisch eingebunden. | console.log(process.env.HOME); |
| TS2739 Mehrere Eigenschaften fehlen | Wie TS2741, aber es fehlen gleich mehrere Eigenschaften – der Compiler listet sie auf. | Fehlende Eigenschaften ergänzen oder einen passenderen Typ wählen (z. B. Partial<T> für Entwürfe). | interface Adresse { strasse: string; plz: string; ort: string }
const a: Adresse = { strasse: "Musterweg 1" }; |
| TS2741 Pflicht-Eigenschaft fehlt | Ein Objekt soll einem Typ entsprechen, aber eine nicht optionale Eigenschaft fehlt. | Eigenschaft ergänzen – oder im Typ als optional kennzeichnen (email?: string), wenn sie wirklich fehlen darf. | interface Nutzer { id: number; name: string }
const n: Nutzer = { id: 1 }; |
| TS2769 Keine Überladung passt | Die Funktion hat mehrere Signaturen (Overloads), aber keine akzeptiert die übergebenen Argumente. Darunter listet der Compiler, woran jede Signatur gescheitert ist. | Die Liste unter der Meldung lesen: meist passt der Typ eines Arguments nicht. | function formatiere(x: string): string;
function formatiere(x: number): string;
function formatiere(x: string | number) { return String(x); }
formatiere(true); |
| TS6133 Deklariert, aber nie gelesen | Mit noUnusedLocals/noUnusedParameters meldet der Compiler Variablen, die nie verwendet werden – oft Reste nach einer Änderung. | Entfernen oder mit _ beginnen lassen (bei Parametern). | function f() {
const unbenutzt = 1;
} |
| TS7006 Parameter implizit `any` | Ein Funktionsparameter hat keine Typangabe, und der Compiler kann ihn nicht aus dem Kontext ableiten. Mit noImplicitAny (Teil von strict) ist das ein Fehler, weil any die Typprüfung abschaltet. | Typ angeben: function f(x: number). Bei Callbacks hilft oft ein typisierter Kontext (z. B. array.map(x => …) leitet x ab). | function begruesse(name) {
return "Hallo " + name;
} |
| TS7031 Destrukturiertes Element implizit `any` | Wie TS7006, aber für ein Element aus einer Destrukturierung, z. B. ({ titel }) => … ohne Typ. | Den ganzen Parameter typisieren: ({ titel }: { titel: string }) => … oder mit einem benannten Props-Typ. | function Karte({ titel }) {
return titel;
} |
| TS7053 Implizites `any` beim Indexzugriff | Ein Objekt wird mit einem beliebigen string indiziert, hat aber keine Index-Signatur. Der Compiler weiß nicht, welcher Typ herauskommt. | Schlüssel als keyof typeof obj typisieren oder das Objekt als Record<string, T> deklarieren. | const preise = { apfel: 1, birne: 2 };
function preis(sorte: string) {
return preise[sorte];
} |
| TS18013 Privates #-Feld von außen | Felder mit # sind echte private Felder aus ECMAScript – außerhalb der Klasse gibt es sie nicht, auch nicht zur Laufzeit. | Eine Methode oder einen Getter in der Klasse anbieten. | class Zaehler {
#wert = 0;
}
console.log(new Zaehler().#wert); |
| TS18046 Wert ist vom Typ `unknown` | unknown ist das sichere Gegenstück zu any: Man darf alles hineinstecken, aber nichts damit tun, bevor der Typ geprüft wurde. | Mit typeof, instanceof, in oder einem Type Guard eingrenzen – danach ist der Zugriff erlaubt. | function laenge(wert: unknown) {
return wert.length;
} |
| TS18047 Wert ist möglicherweise `null` | Wie TS18048, nur mit null – typisch bei APIs, die „nichts gefunden“ mit null melden. | Mit if (x !== null), x?. oder x ?? ersatz absichern. | function suche(id: number): string | null {
return id === 1 ? "Ada" : null;
}
const name = suche(2);
console.log(name.length); |
| TS18048 Wert ist möglicherweise `undefined` | Mit strictNullChecks gehört undefined zum Typ (z. B. bei optionalen Eigenschaften x?: T oder array.find()), wird aber so verwendet, als wäre er sicher vorhanden. | Vorher prüfen (if (x !== undefined)), optionale Verkettung x?.y, Standardwert x ?? 0 – den Non-Null-Operator x! nur, wenn Sie es wirklich wissen. | const zahlen = [1, 2, 3]; const gefunden = zahlen.find((n) => n > 5); console.log(gefunden.toFixed(2)); |