Schreibe wiederverwendbare Funktionen und Typen, die bei jedem Aufruf die volle Typgenauigkeit behalten.
Diese Lektion in Kodokon öffnenDu verwendest Generics längst, ohne es zu merken: string[], Promise<number>... Zeit, eigene zu schreiben. Ein Generic führt einen Typparameter ein, also eine Variable, die bei jeder Verwendung durch einen konkreten Typ ersetzt wird. Das Ziel: die Logik einmal schreiben, ohne auf Typgenauigkeit zu verzichten.
function first<T>(items: T[]): T | undefined {
return items[0];
}
const n = first([10, 20, 30]);
const s = first(["a", "b"]);Beachte, dass du an der Aufrufstelle nichts angegeben hast: TypeScript leitet T aus dem Argument ab. Ein Generic ohne Einschränkung akzeptiert alles; oft braucht eine Funktion aber ein Minimum an Garantien über ihre Daten. Das Schlüsselwort extends erzwingt eine minimale Form für T.
interface HasId {
id: number;
}
function findById<T extends HasId>(
items: T[],
id: number
): T | undefined {
return items.find((item) => item.id === id);
}Typen selbst können generisch sein. Das ist Alltag im Netzwerkcode: Die Struktur der Antwort ist stabil, nur der Inhalt von data variiert. Ein einziger Typ beschreibt dann alle deine API-Antworten.
interface ApiResponse<T> {
ok: boolean;
data: T;
}
type UserResponse = ApiResponse<{ name: string }>;
const res: UserResponse = {
ok: true,
data: { name: "Ada" },
};