🧬Generics
Generics sind Funktionen auf Typebene: Ein Typparameter wie T ist ein Platzhalter, den der Aufrufer (oder die Inferenz) mit einem echten Typ füllt. So bleibt Code wiederverwendbar, ohne Typinformation zu verlieren – anders als mit any.
function verpacke<T>(wert: T): { wert: T } Aufruf: verpacke(42)
│ │ │ │
│ └───────────┼──── T wird aus dem Argument abgeleitet: T = number
▼ ▼
Rückgabetyp: { wert: T } ──▶ { wert: number }🎛️Typen einsetzen
Typparameter ableiten
<T> ist ein Platzhalter für einen Typ. Beim Aufruf setzt TypeScript für T den Typ des Arguments ein (Inferenz) – der Rückgabetyp folgt automatisch. Literale werden dabei verbreitert (1 | "eins" → string | number), außer man schreibt <const T>.
…Typargument explizit angeben
Man kann T auch selbst festlegen: verpacke<string>(…). Dann prüft der Compiler das Argument gegen diesen Typ.
…Einschränkung mit extends
T extends { length: number } verlangt: Was auch immer T ist, es muss eine Eigenschaft length vom Typ number haben. Dadurch darf die Funktion x.length benutzen.
…Schlüssel mit keyof
Zwei Typparameter, einer hängt vom anderen ab: K extends keyof T erlaubt nur existierende Schlüssel. Der Rückgabetyp T[K] ist der Typ genau dieser Eigenschaft.
…Standard-Typen
Typparameter können einen Standardwert haben (T = unknown). Wird nichts angegeben, gilt der Standard – haben alle Parameter einen Standard, darf man die spitzen Klammern ganz weglassen. Beachten Sie: unknown | null ist einfach unknown.
…📚Generische Klassen
new Stapel<number>() legt T für die ganze Instanz fest – lege("zwei") ist dann ein Fehler.T (Type), K/V (Key/Value), E (Element),R (Return). Bei mehreren Parametern helfen sprechende Namen wie TEingabe.T nicht: new T() oder x instanceof T sind unmöglich. Wer den Typ zur Laufzeit braucht, übergibt eine Klasse oder eine Prüffunktion als Argument.