Vererbung in TypeScript
Vererbung
~14 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026
Unsere Bibliothek soll neben normalen Büchern auch HÖRBÜCHER verwalten – mit fast denselben Eigenschaften, aber einer zusätzlichen Spiellänge statt Seitenzahl. Vererbung vermeidet, gemeinsamen Code zu duplizieren.
Eine gemeinsame Basisklasse: Medium
import { Autor } from './Autor.js';
import { Genre } from './Genre.js';
import { BuchStatus } from './Buch.js';
export class Medium {
constructor(
public readonly isbn: string,
public titel: string,
public autor: Autor,
public erscheinungsjahr: number,
public genres: Genre[],
public status: BuchStatus,
) {}
beschreibung(): string {
return `${this.titel} von ${this.autor.name} (${this.erscheinungsjahr})`;
}
}Medium nutzt Constructor Property Promotion aus Kapitel 12 für ALLE gemeinsamen Eigenschaften – bewusst als KLASSE statt Interface, weil wir hier bereits VERHALTEN (beschreibung()) mit den Daten bündeln wollen, das ALLE abgeleiteten Typen teilen.
Buch und Hoerbuch als abgeleitete Klassen
import { Medium } from './Medium.js';
import { Autor } from './Autor.js';
import { Genre } from './Genre.js';
export type BuchStatus = 'verfuegbar' | 'ausgeliehen' | 'reserviert';
export class Buch extends Medium {
constructor(
isbn: string,
titel: string,
autor: Autor,
erscheinungsjahr: number,
genres: Genre[],
status: BuchStatus,
public seitenzahl: number,
) {
super(isbn, titel, autor, erscheinungsjahr, genres, status);
}
}import { Medium } from './Medium.js';
import { Autor } from './Autor.js';
import { Genre } from './Genre.js';
import { BuchStatus } from './Buch.js';
export class Hoerbuch extends Medium {
constructor(
isbn: string,
titel: string,
autor: Autor,
erscheinungsjahr: number,
genres: Genre[],
status: BuchStatus,
public spiellaengeMinuten: number,
public sprecher: string,
) {
super(isbn, titel, autor, erscheinungsjahr, genres, status);
}
// überschreibt die geerbte Methode mit einer erweiterten Version
override beschreibung(): string {
return `${super.beschreibung()}, gelesen von ${this.sprecher}`;
}
}extends, super und override im Detail
extends Medium–Buch/HoerbuchERBEN ALLE Eigenschaften und Methoden vonMedium, ohne sie neu zu schreiben.super(...)– MUSS als ERSTE Anweisung im Constructor einer abgeleiteten Klasse aufgerufen werden, ruft den Constructor der BASISKLASSE auf, um die geerbten Eigenschaften zu initialisieren.override beschreibung()– ERSETZT die geerbte Methode durch eine eigene Implementierung. Dasoverride-Schlüsselwort ist eine ausdrückliche ABSICHTSERKLÄRUNG: "ich überschreibe bewusst eine geerbte Methode" – TypeScript zeigt einen Fehler, wennMediumGAR KEINE Methode namensbeschreibunghätte (Tippfehler-Schutz).super.beschreibung()– ruft die URSPRÜNGLICHE, geerbte Version der Methode auf, bevorHoerbucheigenen Text ANHÄNGT – Wiederverwendung statt Duplikation.
Polymorphie: verschiedene Medien einheitlich behandeln
const medien: Medium[] = [
new Buch('123', 'Der Hobbit', tolkien, 1937, ['Fantasy'], 'verfuegbar', 310),
new Hoerbuch('456', 'Der Hobbit', tolkien, 1937, ['Fantasy'], 'verfuegbar', 620, 'Achim Höppner'),
];
medien.forEach((medium) => console.log(medium.beschreibung()));
// Buch nutzt die GEERBTE beschreibung(), Hoerbuch die ÜBERSCHRIEBENE -
// derselbe Aufruf, unterschiedliches Verhalten, je nach TATSÄCHLICHEM Typmedien: Medium[] kann BEIDE Typen aufnehmen, weil Buch UND Hoerbuch beide Medium SIND ("is-a"-Beziehung) – GENAU das ist "Polymorphie": derselbe Methodenaufruf (beschreibung()) verhält sich je nach tatsächlichem Objekttyp unterschiedlich, ohne dass der aufrufende Code das selbst prüfen müsste.
Achtung: Vererbung ist mächtig, aber leicht ÜBERZUSTRAPAZIEREN – tiefe Vererbungshierarchien (A extends B extends C extends D) werden schnell unübersichtlich. Als Faustregel: Vererbung nur für ECHTE "ist ein"-Beziehungen (ein Hörbuch IST ein Medium), NICHT für reine Code-Wiederverwendung ohne konzeptionelle Beziehung – dafür gibt es andere Muster (Komposition), außerhalb des Rahmens dieses Kapitels.