Statische Member, Getter und Setter in TypeScript
Statische Member, Getter und Setter
~14 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026
Zum Abschluss von Phase 3 (Objektorientierte Programmierung): zwei Werkzeuge, die INSTANZ-unabhängige Funktionalität (static) bzw. kontrollierten Eigenschaftszugriff mit normaler Punkt-Syntax (get/set) ermöglichen.
Statische Member: gehören zur Klasse, nicht zur Instanz
export class Bibliothek {
private static naechsteId = 1; // gehört zur KLASSE, nicht zu einer einzelnen Bibliothek
public readonly id: number;
private bestand: Buch[];
constructor(startBestand: Buch[]) {
this.id = Bibliothek.naechsteId++; // Zugriff über den Klassennamen, nicht 'this'
this.bestand = startBestand;
}
}
const a = new Bibliothek([]);
const b = new Bibliothek([]);
console.log(a.id, b.id); // 1, 2 - jede Instanz bekommt eine EINDEUTIGE, fortlaufende IDstatic naechsteId existiert GENAU EINMAL, geteilt von ALLEN Instanzen von Bibliothek – anders als bestand, das JEDE Instanz für sich hat. Zugriff erfolgt über Bibliothek.naechsteId (Klassenname), NICHT this.naechsteId.
Statische Methoden: Utility-Funktionen an die Klasse gebunden
export class Buch {
// ... bestehende Eigenschaften
static istGueltigeIsbn(isbn: string): boolean {
const bereinigt = isbn.replace(/-/g, '');
return bereinigt.length === 13 && /^\d+$/.test(bereinigt);
}
}
Buch.istGueltigeIsbn('978-3-608-93830-2'); // true - AUFRUF über Klassennamen, keine Instanz nötigstatic istGueltigeIsbn(...) braucht KEINE Buch-Instanz, um aufgerufen zu werden – sinnvoll für Hilfsfunktionen, die logisch zu einer Klasse GEHÖREN (ISBN-Validierung ist ein "Buch"-Konzept), aber keinen Zugriff auf this brauchen.
Getter und Setter: berechnete Eigenschaften mit Punkt-Syntax
export class Buch extends Medium {
private _seitenzahl: number;
constructor(/* ... */ seitenzahl: number) {
super(/* ... */);
this._seitenzahl = seitenzahl;
}
get seitenzahl(): number {
return this._seitenzahl;
}
set seitenzahl(wert: number) {
if (wert <= 0) {
throw new Error('Seitenzahl muss positiv sein.');
}
this._seitenzahl = wert;
}
get lesezeitMinuten(): number {
return Math.round(this._seitenzahl * 1.5); // BERECHNETER Wert, keine echte Eigenschaft
}
}
const buch = new Buch(/* ... */ 300);
console.log(buch.seitenzahl); // 300 - liest wie eine normale Eigenschaft, ruft aber den GETTER auf
buch.seitenzahl = 350; // schreibt wie eine normale Eigenschaft, ruft den SETTER auf
buch.seitenzahl = -10; // wirft den Error aus dem Setter
console.log(buch.lesezeitMinuten); // 450 - NUR ein Getter, kein passender Setter -> read-onlyVon AUSSEN sieht buch.seitenzahl aus wie eine GEWÖHNLICHE Eigenschaft (keine Klammern wie bei einem Methodenaufruf!) – INTERN läuft aber bei jedem Lesen/Schreiben Ihr eigener Code. Der führende Unterstrich _seitenzahl ist reine NAMENSKONVENTION (nicht TypeScript-spezifisch), um die "echte", private Datenspeicherung vom öffentlichen Getter/Setter-Paar zu unterscheiden.
Nur ein Getter: automatisch schreibgeschützt
lesezeitMinuten hat NUR einen get, KEINEN set – der Versuch buch.lesezeitMinuten = 100 würde einen Kompilierzeit-Fehler auslösen. Das ist ein ELEGANTERES Äquivalent zu readonly aus Kapitel 7/11 für Werte, die BERECHNET statt gespeichert werden.
Achtung: Getter/Setter fühlen sich "magisch" an, aber Vorsicht vor ÜBERMÄSSIGER Logik darin – ein Getter, der aufwendige Berechnungen oder gar Netzwerk-Aufrufe macht, überrascht Aufrufer, die buch.seitenzahl für eine simple, billige Eigenschaftslesung halten. Faustregel: Getter/Setter für EINFACHE Validierung und leichte Berechnung, echte asynchrone/teure Operationen gehören in explizit benannte Methoden.
Tipp: Damit ist Phase 3 (OOP) abgeschlossen – Klassen, Vererbung, Zugriffsmodifizierer, abstrakte Klassen, statische Member, Getter/Setter. Phase 4 wendet sich den WIRKLICH fortgeschrittenen TypeScript-Features zu, beginnend mit Generics – dem Werkzeug, das unsere bisher etwas repetitive Bibliothek-Klasse WIEDERVERWENDBAR für JEDEN Medientyp macht, nicht nur Bücher.