Zusammenfassung
In dieser Lektion hast du gelernt:
- Eine Funktion, die mit jedem Typ arbeiten soll, verliert den Typ mit
any(Fehler schlüpfen durch) und mitunknown(du musst nach jedem Aufruf eingrenzen). Eine Funktion pro Typ wiederholt denselben Code. Generics lösen das. - Eine generische Funktion hat einen Typparameter in spitzen Klammern:
function erstes<T>(elemente: T[]): T | undefined.Tist ein Typ, der bei jedem Aufruf eingesetzt wird: Beierstes(namen)istTgleichstring. - TypeScript leitet die Typargumente aus den Argumenten ab. Du kannst sie auch schreiben,
erstes<string>(namen); das ist nötig, wenn TypeScript einen zu engen Typ ableiten würde:fuelle<string | null>(null). Eine Funktion kann mehrere Typparameter haben:paar<A, B>(erstes: A, zweites: B): [A, B]. string[]ist die Kurzform vonArray<string>. Bei Unions istArray<string | number>oft besser lesbar als(string | number)[];string | number[]bedeutet etwas anderes. AuchRecord<K, V>ist ein generischer Typ.- Auch deine eigenen Typen können generisch sein:
type Truhe<T> = { ort: string; beute: T };,interface Regal<T> { gegenstaende: T[] }. Bei einer Variablen schreibst du das Typargument:Truhe<number>. type Ergebnis<T> = { ok: true; wert: T } | { ok: false; fehler: string };beschreibt das Ergebnis von etwas, das scheitern kann; prüfeif (ergebnis.ok), bevor duergebnis.wertverwendest.- Eine Einschränkung begrenzt einen Typparameter:
<T extends { kraft: number }>. Darin istding.krafterlaubt, und das Ergebnis behält den vollen Typ des Aufrufers. keyof Werteist die Union der Schlüssel vonWerte.<K extends keyof Held>(held: Held, schluessel: K): Held[K]liest eine Eigenschaft über ihren Schlüssel und gibt ihren genauen Typ zurück.
In der nächsten Lektion, Klassen, erzeugst du Objekte aus Vorlagen: Eine Klasse beschreibt einmal, was jeder Held oder jedes Monster hat und was es kann, und TypeScript prüft alles davon.
Aber zuerst fasst du diese Lektion zusammen. Der Laden verkauft Tränke und Waffen, die verschiedene Typen sind, aber beide haben einen preis. Im Editor findest du den Typ Ergebnis aus dieser Lektion und die Waren des Ladens; das Waffenregal ist heute leer.
So schreibst du es:
Anweisungen
- 1
Schreibe eine generische Funktion
guenstigstes<T extends { preis: number }>(angebote: T[]): Ergebnis<T>. Bei einem leeren Array scheitert sie mit dem Fehler"nichts im Angebot". Sonst ist sie erfolgreich, und ihr Wert ist der Gegenstand mit dem niedrigsten Preis. - 2
Finde mit
guenstigstesden günstigsten Trank. Wenn es erfolgreich ist, gib den Namen des Tranks aus und wie viel er heilt; wenn nicht, gib den Fehler aus:Kleiner Trank heilt 5 - 3
Mache jetzt dasselbe für die Waffen: Wenn
guenstigsteserfolgreich ist, gib den Namen der Waffe und ihrenschadenaus, sonstKeine Waffe:und den Fehler. Das Waffenregal ist leer, also gibt das Programm aus:Kleiner Trank heilt 5 Keine Waffe: nichts im Angebot