Array<T>
Du verwendest schon seit einer Weile generische Typen, ohne es zu wissen. Der Array-Typ string[] ist eine Kurzschreibweise für Array<string>: den generischen Typ Array<T> mit dem Typargument string. Diese beiden Zeilen bedeuten genau dasselbe:
const namen: string[] = ["Kira", "Bruno"];
const gleicheNamen: Array<string> = ["Kira", "Bruno"];Generische Typen bekommen ihre Typargumente in spitzen Klammern, wie generische Funktionen. In einer Typannotation schreibst du sie immer, denn es gibt nichts, woraus sie abgeleitet werden könnten. Wenn du sie vergisst, erinnert TypeScript dich daran und zeigt, wie der Typ deklariert ist:
const beute: Array = ["Rubin", "Alter Schlüssel"];TypeScript meldet:
main.ts(1,14): error TS2314: Generic type 'Array<T>' requires 1 type argument(s).So beschreibt TypeScript jedes Array: Array<T>, wobei T der Typ der Elemente ist, und auch die Methoden des Arrays verwenden T. Deshalb akzeptiert push nur ein T, und deshalb gibt find ein T | undefined zurück: In der Lektion über Unions und Narrowing hast du daraus ein Gegenstand | undefined bekommen. Auch map ist generisch: Es gibt ein Array von dem zurück, was deine Funktion zurückgibt, also ist preise.map(preis => `${preis} Gold`) ein string[]. In Fehlermeldungen schreibt TypeScript Arrays in der Kurzform, zum Beispiel string[].
Wann Array<…> klarer ist. Eine Truhe enthält Namen von Gegenständen und Münzen, ihre Elemente sind also string | number:
const beute: string | number[] = ["Rubin", 25, "Alter Schlüssel", 10];TypeScript meldet:
main.ts(1,7): error TS2322: Type '(string | number)[]' is not assignable to type 'string | number[]'.
Type '(string | number)[]' is not assignable to type 'number[]'.
Type 'string | number' is not assignable to type 'number'.
Type 'string' is not assignable to type 'number'.Die Annotation string | number[] bedeutet nicht, was sie zu bedeuten scheint: Das [] gehört nur zu number, der Typ ist also „ein Text oder ein Array von Zahlen“. Die eingerückten Zeilen zeigen, wie TypeScript die zweite Möglichkeit versucht und an den Texten scheitert. Der Typ, den du willst, ist (string | number)[], mit Klammern, oder, besser lesbar, Array<string | number>.
Auch Record ist generisch. In der Lektion Daten modellieren hast du Record<Seltenheit, number> verwendet. Das ist der generische Typ Record<K, V> mit zwei Typparametern: K für die Schlüssel und V für die Werte. In Fehlermeldungen erscheint er wie jeder andere Typ:
type Seltenheit = "haeufig" | "selten" | "legendaer";
const preise: Record<Seltenheit, number> = { haeufig: 5, selten: 50 };TypeScript meldet:
main.ts(2,7): error TS2741: Property 'legendaer' is missing in type '{ haeufig: number; selten: number; }' but required in type 'Record<Seltenheit, number>'.Beide Schreibweisen für Arrays sind in Ordnung. Viele Programmierer schreiben string[], wenn der Elementtyp einfach ist, und Array<…>, wenn er länger ist, etwa eine Union.
So schreibst du es:
Anweisungen
- 1
Korrigiere die Annotation von
beute: Schreibe ihren Typ mitArray<…>, sodass das Programm Folgendes ausgibt:["Rubin", 25, "Alter Schlüssel", 10] - 2
Schreibe eine Funktion
zaehleMuenzen(dinge: Array<string | number>): number, die die Zahlen im Array addiert und die Texte überspringt (grenze mittypeofein). Gib damit die Münzen in der Truhe aus:Münzen: 35