Sobes.tech
Middle

Wann sollte man in TypeScript Typen und wann Schnittstellen verwenden?

sobes.tech KI

Antwort von AI

Die Typen (type) sollten verwendet werden für:

  • Vereinigungen (unions) und Schnittmengen (intersections):
    type Status = "pending" | "completed" | "failed";
    type UserWithAddress = User & Address;
    
  • Primitive Typen und Literale:
    type ID = string | number;
    type Direction = "up" | "down" | "left" | "right";
    
  • Tupel:
    type RgbColor = [number, number, number];
    
  • Erstellung von Aliasen für bestehende Typen:
    type StringOrNumber = string | number;
    
  • Bedingte Typen:
    type TypeOfProp<T, K extends keyof T> = T[K];
    

Interfaces (interface) sollten verwendet werden für:

  • Beschreibung der Objektstruktur:
    interface User {
      id: number;
      name: string;
      age?: number; // Optionale Eigenschaft
    }
    
  • Implementierung durch Klassen (implements):
    interface Logger {
      log(message: string): void;
    }
    
    class ConsoleLogger implements Logger {
      log(message: string) {
        console.log(message);
      }
    }
    
  • Erweiterung anderer Interfaces (extends):
    interface Person {
      name: string;
    }
    
    interface Employee extends Person {
      employeeId: number;
    }
    
  • Deklaratives Zusammenführen (declaration merging): Dies erlaubt es, eine bestehende Schnittstelle durch erneutes Deklarieren zu erweitern. Bei Typen ist dies nicht möglich.
    interface Box {
      width: number;
    }
    
    interface Box { // Dies fügt die Eigenschaft height zur Schnittstelle Box hinzu
      height: number;
    }
    

Kurzer Vergleich:

Eigenschaft type interface
Vereinigungstypen Ja Nein
Schnittmengen Ja Nein
Primitive Typen/Literale Ja Nein
Tupel Ja Nein
Alias für Typen Ja Nein
Bedingte Typen Ja Nein
Objektbeschreibung Ja Ja
Klassenimplementierung Nein Ja
Erweiterung Ja (mit &) Ja (mit extends)
Deklaratives Zusammenführen Nein Ja

Im Allgemeinen ist es besser, interface zu verwenden, um die Objektstruktur zu beschreiben, da sie besser zum objektorientierten Ansatz passt und deklaratives Zusammenführen unterstützt. Für alles andere, insbesondere für Kombinationen und das Erstellen neuer Typen aus bestehenden, ist type flexibler.