Kurz: zahlen.sort((a, b) => a - b); console.log(zahlen, namen.map((n) => n.toUpperCase()), gemischt.length, matrix[1][0]); `output [ 1, 2, 3 ] [ 'MIA', 'TOM' ] 3 3
Teil des Kurses TypeScript
Kapitel 6 von 15 im Kurs TypeScript. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.
Arrays
const zahlen: number[] = [3, 1, 2];
const namen: Array<string> = ["Mia", "Tom"];
const gemischt: (string | number)[] = [1, "zwei", 3];
const matrix: number[][] = [[1, 2], [3, 4]];
zahlen.sort((a, b) => a - b);
console.log(zahlen, namen.map((n) => n.toUpperCase()), gemischt.length, matrix[1][0]);Ausgabe:
[ 1, 2, 3 ] [ 'MIA', 'TOM' ] 3 3Methoden wie map und filter übernehmen den Elementtyp:
const personen = [{ name: "Mia", alter: 17 }, { name: "Tom", alter: 19 }];
const volljaehrig = personen.filter((p) => p.alter >= 18).map((p) => p.name);
console.log(volljaehrig);Ausgabe:
[ 'Tom' ]Mit readonly schützt du ein Array vor Änderungen:
const fest: readonly number[] = [1, 2, 3];
console.log(fest.map((x) => x * 2));Ausgabe:
[ 2, 4, 6 ]const fest: readonly number[] = [1, 2, 3];
fest.push(4);Fehlermeldung:
error TS2339: Property 'push' does not exist on type 'readonly number[]'.Tupel
Ein Tupel ist ein Array mit fester Länge und festen Typen pro Position:
const punkt: [number, number] = [3, 4];
const eintrag: [string, number, boolean] = ["Mia", 17, true];
const [x, y] = punkt; // Destructuring
console.log(x + y, eintrag[0], eintrag[2]);
const mitName: [name: string, alter: number] = ["Tom", 19]; // benannte Elemente
console.log(mitName);
function minMax(z: number[]): [min: number, max: number] {
return [Math.min(...z), Math.max(...z)];
}
const [kleinste, groesste] = minMax([4, 9, 2]);
console.log(kleinste, groesste);Ausgabe:
7 Mia true
[ 'Tom', 19 ]
2 9Tupel sind ideal, wenn eine Funktion mehrere Werte zurückgibt (wie useState in React).
Enums
Ein enum gibt Konstanten Namen:
enum Farbe { Rot, Gruen, Blau }
enum Status { Offen = "OFFEN", Fertig = "FERTIG" }
console.log(Farbe.Gruen, Farbe[2], Status.Offen);Enums erzeugen echten JavaScript-Code. Viele Teams ziehen deshalb Union-Literaltypen oder as const-Objekte vor. Sie sind schlanker, funktionieren mit allen Werkzeugen (auch dem direkten Ausführen von .ts-Dateien) und verhalten sich vorhersagbar:
const Status = {
Offen: "OFFEN",
InArbeit: "IN_ARBEIT",
Fertig: "FERTIG",
} as const;
type Status = typeof Status[keyof typeof Status]; // "OFFEN" | "IN_ARBEIT" | "FERTIG"
function beschreibe(s: Status): string {
return s === Status.Fertig ? "erledigt" : "noch zu tun";
}
console.log(Status.Offen, beschreibe("FERTIG"), beschreibe(Status.Offen));
console.log(Object.values(Status));Ausgabe:
OFFEN erledigt noch zu tun
[ 'OFFEN', 'IN_ARBEIT', 'FERTIG' ]as const macht aus einem Objekt oder Array einen vollständig schreibgeschützten Typ mit Literalen:
const farben = ["rot", "gruen", "blau"] as const;
type Farbe = typeof farben[number]; // "rot" | "gruen" | "blau"
const f: Farbe = "gruen";
console.log(f, farben.length);Ausgabe:
gruen 3Über Arrays iterieren, mit Typen
const preise: Record<string, number> = { apfel: 1.2, birne: 1.5 };
for (const [name, preis] of Object.entries(preise)) {
console.log(name.padEnd(6), preis.toFixed(2));
}
const lookup = new Map<string, number>([["a", 1], ["b", 2]]);
const menge = new Set<number>([1, 2, 2, 3]);
console.log(lookup.get("a"), menge.size);Ausgabe:
apfel 1.20
birne 1.50
1 3noUncheckedIndexedAccess
Beim Zugriff liste[5] nimmt TypeScript an, dass es das Element gibt. Mit der Option noUncheckedIndexedAccess in der tsconfig.json wird das Ergebnis zu T | undefined, und du musst es prüfen: sicherer, aber etwas umständlicher.
Merke
- Arrays:
T[]oderArray<T>;readonly T[]ist unveränderlich - Tupel: feste Länge und Typen pro Stelle, gut für mehrere Rückgabewerte
- Statt
enumoft besser:as const-Objekte oder Union-Literaltypen typeof x[number]undkeyof typeofleiten Typen aus Werten abMap<K, V>undSet<T>sind generisch typisiert
Übungsaufgabe
Definiere ein as const-Objekt mit Wochentagen, leite daraus den Typ Wochentag ab und schreibe eine Funktion, die für jeden Wochentag angibt, ob Wochenende ist.
Quiz zur Selbstkontrolle
Was ist ein Tupel?
- Ein Array mit fester Länge und festen Typen pro Position (richtig)
- Ein Objekt
- Ein Textwert
- Eine Funktion
Was bewirkt as const?
- Werte werden schreibgeschützt und als Literaltypen erkannt (richtig)
- Der Wert wird in eine Konstante kopiert
- Der Typ wird zu any
- Der Wert wird gelöscht
Warum verwenden viele Teams statt enum Literal-Unions?
- Sie erzeugen keinen zusätzlichen Laufzeitcode und sind einfacher (richtig)
- enum ist verboten
- Unions sind schneller zu schreiben
- enum funktioniert nur im Browser
Weiter im Kurs
Zurück: Unions, Literaltypen und Narrowing
Weiter: Klassen in TypeScript
Alle Kapitel: TypeScript im Überblick