Beide Mechanismen — interface und type alias — ermöglichen die Beschreibung von Datenstrukturen (Objekte, Funktionen, komplexe Typen).
Unterschiede:
|) und Schnittmengen (&).Beispiel:
interface Animal { name: string } interface Dog extends Animal { bark(): void } // type alias für Typenvereinigung: type MyType = string | number type Cat = Animal & { purr(): void }
Empfehlung:
interface.type.Frage: Kann man ein neues Feld zu einem Typ hinzufügen, der über type alias in einer anderen Datei definiert wurde?
Antwort:
Nein. Type alias kann nicht deklarativ aus einer anderen Datei erweitert werden, im Gegensatz zu interface.
Beispiel:
// main.ts type User = { name: string } // another.ts type User = { age: number } // Fehler: Duplicate identifier // interface: // main.ts interface User { name: string } // another.ts interface User { age: number } // Ok, User = { name: string, age: number }
Geschichte
In einem großen Projekt wurden gemeinsame Datenstrukturen über type alias definiert. Als es notwendig wurde, ein Feld zu einem bestehenden Typ aus einem anderen Paket hinzuzufügen, stellte sich heraus, dass type alias die Erklärungsmeldung nicht unterstützt — es musste auf interface umgeschrieben werden, was Verzögerungen verursachte.
Geschichte
Einer der Entwickler beschrieb Funktionen über interface und versuchte dann, einen Union-Typ (String oder Funktion) hinzuzufügen — es stellte sich heraus, dass interface dafür nicht geeignet ist, und alle Definitionen mussten auf type alias mit intersection/union geändert werden.
Geschichte
Nach dem Wechsel von type alias zu interface wurde die Syntax der Erweiterung verwechselt: Es wurde versucht, extends zu verwenden, anstatt über & zu vereinen. Der Fehler trat spät auf und die Ursache wurde nicht sofort erkannt.