Arrays, Tupel und Readonly in TypeScript vertieft
Arrays, Tupel und Readonly vertieft
~13 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026
Zum Abschluss von Phase 2 vertiefen wir Arrays und Tupel aus Kapitel 4 – inklusive readonly-Arrays, benannten Tupel-Elementen und optionalen Tupel-Positionen.
readonly Arrays: Schutz vor versehentlicher Veränderung
function zeigeGenres(genres: readonly string[]): void {
console.log(genres.join(', '));
genres.push('Neu'); // Fehler - push() verändert das Array, readonly verbietet das
}
const alleGenres: readonly string[] = ['Fantasy', 'Krimi'];
alleGenres[0] = 'Roman'; // Fehler - auch direkte Index-Zuweisung ist verbotenGENAU wie readonly bei Interface-Eigenschaften (Kapitel 7) verhindert readonly string[], dass das Array NACH der Übergabe verändert wird – nützlich als "Vertrag", wenn eine Funktion ein Array nur LESEN, aber niemals verändern soll.
Wichtiger Unterschied: readonly Array vs. const Array
const genres: string[] = ['Fantasy'];
genres.push('Krimi'); // ✓ ERLAUBT - const verhindert nur NEUZUWEISUNG der Variable,
// NICHT Veränderung des Array-INHALTS
genres = ['Roman']; // ✗ Fehler - DAS verbietet constAchtung: Ein häufiges Missverständnis: const macht ein Array NICHT unveränderlich – es verhindert nur, dass die VARIABLE selbst neu zugewiesen wird. push(), splice(), direkte Index-Zuweisung bleiben mit const ALLE erlaubt. Für WIRKLICHE Unveränderlichkeit brauchen Sie readonly, wie oben gezeigt.
Benannte Tupel-Elemente
type RegalPosition = [regal: string, fach: number, position: number];
function formatierePosition(pos: RegalPosition): string {
const [regal, fach, position] = pos; // Destructuring wie gewohnt
return `${regal}, Fach ${fach}, Position ${position}`;
}Die Namen regal/fach/position in der Typdefinition sind reine DOKUMENTATION – sie ändern NICHTS am tatsächlichen Verhalten (das Tupel bleibt ein normales Array mit drei Elementen), verbessern aber die Lesbarkeit erheblich, besonders in der Autovervollständigung beim Hovern über den Typ.
Optionale Tupel-Elemente
type Suchfilter = [suchtext: string, genre?: string];
const filter1: Suchfilter = ['Tolkien'];
const filter2: Suchfilter = ['Tolkien', 'Fantasy'];
const filter3: Suchfilter = ['Tolkien', 'Fantasy', 'extra']; // Fehler - zu viele ElementePraxis: Bibliotheksdaten mit typisierten Arrays organisieren
import { Buch } from '../models/Buch.js';
import { Autor } from '../models/Autor.js';
export const tolkien: Autor = {
name: 'J.R.R. Tolkien',
geburtsjahr: 1892,
nationalitaet: 'britisch',
};
export const orwell: Autor = {
name: 'George Orwell',
geburtsjahr: 1903,
nationalitaet: 'britisch',
};
export const bibliotheksBestand: readonly Buch[] = [
{
isbn: '978-3-608-93830-2',
titel: 'Der Herr der Ringe',
autor: tolkien,
erscheinungsjahr: 1954,
seitenzahl: 1216,
genres: ['Fantasy'],
status: 'verfuegbar',
},
{
isbn: '978-3-548-23410-6',
titel: '1984',
autor: orwell,
erscheinungsjahr: 1949,
seitenzahl: 328,
genres: ['SachBuch', 'Roman'],
status: 'ausgeliehen',
},
];bibliotheksBestand: readonly Buch[] – der GESAMTE Bibliotheksbestand ist bewusst als schreibgeschütztes Array modelliert. Das ist Absicht: Bücher HINZUFÜGEN oder ENTFERNEN soll später über dedizierte, kontrollierte Funktionen laufen (Kapitel 13, Klassen), nicht durch direkte Array-Manipulation von irgendwo im Code.
Tipp: Damit ist Phase 2 abgeschlossen: Interfaces, Type Aliases, Union/Intersection, Literal Types/Enums, und jetzt vertiefte Arrays/Tupel. Ab dem nächsten Kapitel wenden wir uns OBJEKTORIENTIERTER Programmierung zu – Klassen, die nicht nur Daten, sondern auch VERHALTEN bündeln.