📋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).
CodeBedeutungLösungBeispiel
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));