Magento 2 Experten — Hyvä Theme, Tailwind CSS & SEO aus einer Hand ›

Type Aliases in TypeScript: type vs. interface

Type Aliases: type vs. interface

~13 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026

Neben interface gibt es einen ZWEITEN Weg, einen Typ zu benennen: das type-Schlüsselwort. Dieses Kapitel klärt, WANN welches der beiden Werkzeuge das bessere ist – eine der häufigsten Fragen von TypeScript-Einsteigern.

Die Grundlagen von type

type BuchStatus = 'verfuegbar' | 'ausgeliehen' | 'reserviert'; // dazu mehr in Kapitel 9

type ISBN = string; // ein simpler Alias - KEIN eigener Typ, nur ein anderer Name für string

type BuchZusammenfassung = {
  titel: string;
  autor: string;
};

type kann Objekt-Formen GENAUSO beschreiben wie interfaceBuchZusammenfassung oben ist funktional fast identisch zu einem gleichnamigen Interface. ABER: type kann ZUSÄTZLICH Dinge, die interface NICHT kann, wie BuchStatus (Union aus Literal-Strings) oder ISBN (Alias für einen primitiven Typ) zeigen.

Die drei tatsächlichen Unterschiede

// 1. Nur interface kann durch MEHRFACHE Deklaration erweitert werden ("Declaration Merging"):
interface Konfiguration {
  name: string;
}
interface Konfiguration {
  version: string; // wird AUTOMATISCH zu Konfiguration hinzugefügt, kein Fehler!
}
// Konfiguration hat jetzt { name: string; version: string }

// 2. type kann Dinge beschreiben, die KEINE Objektform sind:
type Zahl = number;
type Koordinate = [number, number];
type Status = 'aktiv' | 'inaktiv';

// 3. interface nutzt 'extends', type nutzt '&' (Intersection, siehe Kapitel 9)
interface Basis { name: string; }
interface Erweitert extends Basis { extra: string; }

type BasisT = { name: string };
type ErweitertT = BasisT & { extra: string };

Achtung: "Declaration Merging" (Punkt 1) ist meistens eine STÖRQUELLE, kein Feature, das Sie aktiv wollen – zwei VERSEHENTLICH gleichnamige Interfaces verschmelzen STILL, statt einen Fehler zu zeigen. type verhält sich hier "sicherer": zwei gleichnamige type-Deklarationen sind IMMER ein Fehler ("Duplicate identifier").

Die praktische Faustregel dieses Tutorials

  • interface für Objektformen, die eine "Sache" mit Identität beschreiben (unsere Buch-, Autor-, Mitglied-Interfaces aus Kapitel 7) – besonders, wenn spätere Erweiterung via extends wahrscheinlich ist.
  • type für ALLES andere: Union Types, Funktionstypen (wie Vergleichsfunktion aus Kapitel 6), Aliase für primitive Typen, Tupel-Typen.

Diese Regel ist eine KONVENTION, keine technische Notwendigkeit – viele erfolgreiche TypeScript-Projekte nutzen ausschließlich type für ALLES. Wichtig ist KONSISTENZ innerhalb eines Projekts, nicht die "perfekt richtige" Wahl im Einzelfall.

Praxis: einen präziseren Buchstatus einführen

Unser bisheriges istAusgeliehen: boolean kann nur ZWEI Zustände abbilden – in der Realität gibt es aber auch "reserviert" (jemand wartet darauf). Wir ersetzen den booleschen Wert durch einen präziseren type:

src/models/Buch.ts
import { Autor } from './Autor.js';

export type BuchStatus = 'verfuegbar' | 'ausgeliehen' | 'reserviert';

export interface Buch {
  readonly isbn: string;
  titel: string;
  autor: Autor;
  erscheinungsjahr: number;
  seitenzahl: number;
  genres: string[];
  status: BuchStatus; // ersetzt das alte istAusgeliehen: boolean
  coverBildUrl?: string;
}

BuchStatus wird in Kapitel 9 (Union Types) im Detail erklärt – hier schon als praktischer Vorgriff genutzt, der zeigt, WARUM type für diesen Anwendungsfall die bessere Wahl ist als interface (ein Interface kann eine solche Werte-Aufzählung nicht ausdrücken).

Tipp: Wenn Sie unsicher sind: fangen Sie mit interface für Objekte an. Sobald Sie etwas brauchen, das interface NICHT kann (Union, Tupel, Funktionstyp), greifen Sie zu type. So laufen Sie nie Gefahr, sich "falsch" zu entscheiden.