ProgrammierungFullstack Entwickler

Erzählen Sie von Schnittstellen (interface) und Typen (type alias) in TypeScript. Wie unterscheiden sie sich, und in welchen Fällen sollte man die eine oder andere Methode wählen?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

Beide Mechanismen — interface und type alias — ermöglichen die Beschreibung von Datenstrukturen (Objekte, Funktionen, komplexe Typen).

  • Interface — klassische Deklaration eines Interfaces. Ermöglicht die Erweiterung von Interfaces, die Vereinigung (declaration merging) und einfache Vererbung.
  • Type alias — erstellt einen neuen Typalias. Kann mit Union / Intersection kombiniert werden, kann jeder Entität zugewiesen werden: Primitives, Funktionen, Tupel usw.

Unterschiede:

  • Erweiterbarkeit: Interface eignet sich besser für objektorientierte Strukturen und unterstützt die deklarative Vereinigung.
  • Flexibilität: Type alias ist universell und eignet sich für alles: Vereinigungen (|) 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:

  • Für öffentliche APIs — verwenden Sie interface.
  • Für komplexe Vereinigungen und Aliase — verwenden Sie type.

Fangfrage.

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 }

Beispiele für reale Fehler aufgrund von Unkenntnis der Feinheiten des Themas.


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.