Zum Hauptinhalt springen

[Medium] Interface vs Type Alias

1. What are Interface and Type Alias?

Was sind Interface und Type Alias?

Interface (Schnittstelle)

Definition: Wird verwendet, um die Struktur eines Objekts zu definieren und zu beschreiben, welche Eigenschaften und Methoden ein Objekt haben soll.

interface User {
name: string;
age: number;
email?: string; // Optionale Eigenschaft
}

const user: User = {
name: 'John',
age: 30,
};

Type Alias (Typalias)

Definition: Erstellt einen Alias fur einen Typ, der fur jeden Typ verwendet werden kann, nicht nur fur Objekte.

type User = {
name: string;
age: number;
email?: string;
};

const user: User = {
name: 'John',
age: 30,
};

2. Interface vs Type Alias: Key Differences

Hauptunterschiede zwischen Interface und Type Alias

1. Erweiterungsmethode

Interface: Verwendung von extends

interface Animal {
name: string;
}

interface Dog extends Animal {
breed: string;
}

const dog: Dog = {
name: 'Buddy',
breed: 'Golden Retriever',
};

Type Alias: Verwendung von Intersection-Typen

type Animal = {
name: string;
};

type Dog = Animal & {
breed: string;
};

const dog: Dog = {
name: 'Buddy',
breed: 'Golden Retriever',
};

2. Zusammenfuhrung (Declaration Merging)

Interface: Unterstutzt Zusammenfuhrung

interface User {
name: string;
}

interface User {
age: number;
}

// Automatisch zu { name: string; age: number; } zusammengefuhrt
const user: User = {
name: 'John',
age: 30,
};

Type Alias: Unterstutzt keine Zusammenfuhrung

type User = {
name: string;
};

type User = { // ❌ Fehler: Duplicate identifier 'User'
age: number;
};

3. Anwendungsbereich

Interface: Hauptsachlich fur Objektstrukturen

interface User {
name: string;
age: number;
}

Type Alias: Fur jeden Typ verwendbar

// Grundtypen
type ID = string | number;

// Funktionstypen
type Greet = (name: string) => string;

// Union-Typen
type Status = 'active' | 'inactive' | 'pending';

// Tupel
type Point = [number, number];

// Objekte
type User = {
name: string;
age: number;
};

4. Berechnete Eigenschaften

Interface: Unterstutzt keine berechneten Eigenschaften

interface User {
[key: string]: any; // Indexsignatur
}

Type Alias: Unterstutzt komplexere Typoperationen

type Keys = 'name' | 'age' | 'email';

type User = {
[K in Keys]: string; // Mapping-Typ
};

3. When to Use Interface vs Type Alias?

Wann Interface verwenden? Wann Type Alias verwenden?

Interface verwenden bei

  1. Definition von Objektstrukturen (am haufigsten)

    interface User {
    name: string;
    age: number;
    }
  2. Wenn Deklarationszusammenfuhrung benotigt wird

    interface Window {
    myCustomProperty: string;
    }
  3. Definition von Klassenvertragen

    interface Flyable {
    fly(): void;
    }

    class Bird implements Flyable {
    fly(): void {
    console.log('Flying');
    }
    }

Type Alias verwenden bei

  1. Definition von Union- oder Intersection-Typen

    type ID = string | number;
    type Status = 'active' | 'inactive';
  2. Definition von Funktionstypen

    type EventHandler = (event: Event) => void;
  3. Definition von Tupeln

    type Point = [number, number];
  4. Wenn Mapping- oder bedingte Typen benotigt werden

    type Partial<T> = {
    [P in keyof T]?: T[P];
    };

4. Common Interview Questions

Haufige Interviewfragen

Frage 1: Grundlegende Unterschiede

Erklaren Sie die Unterschiede der folgenden zwei Definitionsmethoden.

// Methode 1: Interface verwenden
interface User {
name: string;
age: number;
}

// Methode 2: Type Alias verwenden
type User = {
name: string;
age: number;
};
Klicken, um die Antwort anzuzeigen

Gemeinsamkeiten:

  • Beide konnen zur Definition von Objektstrukturen verwendet werden
  • Die Verwendung ist identisch
  • Beide konnen erweitert und vererbt werden

Unterschiede:

  1. Deklarationszusammenfuhrung:

    // Interface unterstutzt es
    interface User {
    name: string;
    }
    interface User {
    age: number;
    }
    // Automatisch zu { name: string; age: number; } zusammengefuhrt

    // Type Alias unterstutzt es nicht
    type User = { name: string; };
    type User = { age: number; }; // ❌ Fehler
  2. Anwendungsbereich:

    // Interface hauptsachlich fur Objekte
    interface User { ... }

    // Type Alias fur jeden Typ
    type ID = string | number;
    type Handler = (event: Event) => void;
    type Point = [number, number];

Empfehlung:

  • Fur Objektstrukturen konnen beide verwendet werden
  • Bei Bedarf an Deklarationszusammenfuhrung Interface verwenden
  • Fur Nicht-Objekt-Typen Type Alias verwenden

Frage 2: Erweiterungsmethoden

Erklaren Sie die Unterschiede der folgenden zwei Erweiterungsmethoden.

// Methode 1: Interface extends
interface Animal {
name: string;
}

interface Dog extends Animal {
breed: string;
}

// Methode 2: Type intersection
type Animal = {
name: string;
};

type Dog = Animal & {
breed: string;
};
Klicken, um die Antwort anzuzeigen

Interface extends:

interface Animal {
name: string;
}

interface Dog extends Animal {
breed: string;
}

// Aquivalent zu
interface Dog {
name: string;
breed: string;
}

Type intersection:

type Animal = {
name: string;
};

type Dog = Animal & {
breed: string;
};

// Aquivalent zu
type Dog = {
name: string;
breed: string;
};

Unterschiede:

  • Syntax: Interface verwendet extends, Type verwendet &
  • Ergebnis: Beide Ergebnisse sind gleich
  • Lesbarkeit: extends von Interface ist intuitiver
  • Flexibilitat: & von Type kann mehrere Typen kombinieren

Beispiel:

// Interface: kann nur eines erweitern
interface Dog extends Animal {
breed: string;
}

// Type: kann mehrere kombinieren
type Dog = Animal & Canine & {
breed: string;
};

Frage 3: Deklarationszusammenfuhrung

Erklaren Sie das Verhalten des folgenden Codes.

interface User {
name: string;
}

interface User {
age: number;
}

const user: User = {
name: 'John',
// Was passiert, wenn age fehlt?
};
Klicken, um die Antwort anzuzeigen
interface User {
name: string;
}

interface User {
age: number;
}

// Die beiden Deklarationen werden automatisch zusammengefuhrt:
// interface User {
// name: string;
// age: number;
// }

const user: User = {
name: 'John',
// ❌ Fehler: Property 'age' is missing in type '{ name: string; }' but required in type 'User'
};

Korrekte Schreibweise:

const user: User = {
name: 'John',
age: 30, // ✅ age muss enthalten sein
};

Anwendungsfalle der Deklarationszusammenfuhrung:

// Erweiterung der Typdefinitionen von Drittanbieter-Paketen
interface Window {
myCustomProperty: string;
}

// Kann nun verwendet werden
window.myCustomProperty = 'value';

Hinweis: Type Alias unterstutzt keine Deklarationszusammenfuhrung

type User = { name: string; };
type User = { age: number; }; // ❌ Fehler: Duplicate identifier

Frage 4: Implementierung (implements)

Erklaren Sie die Unterschiede zwischen Interface und Type Alias bei der Klassenimplementierung.

// Fall 1: Interface
interface Flyable {
fly(): void;
}

class Bird implements Flyable {
fly(): void {
console.log('Flying');
}
}

// Fall 2: Type Alias
type Flyable = {
fly(): void;
};

class Bird implements Flyable {
fly(): void {
console.log('Flying');
}
}
Klicken, um die Antwort anzuzeigen

Beide konnen fur implements verwendet werden:

// Interface
interface Flyable {
fly(): void;
}

class Bird implements Flyable {
fly(): void {
console.log('Flying');
}
}

// Type Alias (Objekttyp)
type Flyable = {
fly(): void;
};

class Bird implements Flyable {
fly(): void {
console.log('Flying');
}
}

Unterschiede:

  • Interface: Traditionell haufiger fur Klassenvertrage verwendet
  • Type Alias: Ebenfalls moglich, aber semantisch ist Interface geeigneter

Empfehlung:

  • Fur Klassenvertrage Interface bevorzugen
  • Wenn bereits mit Type Alias definiert, kann es auch implementiert werden

Hinweis: Mit Type Alias definierte Funktionstypen konnen nicht implementiert werden

type Flyable = () => void;

class Bird implements Flyable { // ❌ Fehler: Nur Objekttypen konnen implementiert werden
// ...
}

5. Best Practices

Best Practices

Empfohlene Vorgehensweisen

// 1. Fur Objektstrukturen Interface bevorzugen
interface User {
name: string;
age: number;
}

// 2. Fur Union-Typen Type Alias verwenden
type Status = 'active' | 'inactive' | 'pending';
type ID = string | number;

// 3. Fur Funktionstypen Type Alias verwenden
type EventHandler = (event: Event) => void;

// 4. Fur Deklarationszusammenfuhrung Interface verwenden
interface Window {
customProperty: string;
}

// 5. Fur Klassenvertrage Interface verwenden
interface Flyable {
fly(): void;
}

class Bird implements Flyable {
fly(): void {}
}

Zu vermeidende Vorgehensweisen

// 1. Interface und Type Alias nicht fur dieselbe Struktur mischen
interface User { ... }
type User = { ... }; // ❌ Verwirrend

// 2. Type Alias nicht fur einfache Objektstrukturen verwenden (ausser bei besonderen Anforderungen)
type User = { // ⚠️ Interface ist geeigneter
name: string;
};

// 3. Interface nicht fur Nicht-Objekt-Typen verwenden
interface ID extends string {} // ❌ Nicht unterstutzt
type ID = string | number; // ✅ Korrekt

6. Interview Summary

Zusammenfassung fur das Interview

Schnellreferenz

Interface (Schnittstelle):

  • Hauptsachlich fur die Definition von Objektstrukturen
  • Unterstutzt Declaration Merging
  • Erweiterung mit extends
  • Geeignet fur Klassenvertrage

Type Alias (Typalias):

  • Fur jeden Typ verwendbar
  • Unterstutzt kein Declaration Merging
  • Erweiterung mit & Intersection-Typ
  • Geeignet fur Union-Typen, Funktionstypen, Tupel

Beispielantworten fur das Interview

Q: Was sind die Unterschiede zwischen Interface und Type Alias?

"Interface und Type Alias konnen beide zur Definition von Objektstrukturen verwendet werden, haben aber einige wesentliche Unterschiede: 1) Interface unterstutzt Declaration Merging - dasselbe Interface kann mehrfach deklariert und automatisch zusammengefuhrt werden; Type Alias unterstutzt dies nicht. 2) Interface wird hauptsachlich fur Objektstrukturen verwendet; Type Alias kann fur jeden Typ verwendet werden, einschliesslich Union-Typen, Funktionstypen, Tupel usw. 3) Interface wird mit extends erweitert; Type Alias mit Intersection-Typ &. 4) Interface ist besser fur Klassenvertrage geeignet. Im Allgemeinen konnen fur Objektstrukturen beide verwendet werden, aber bei Bedarf an Declaration Merging muss Interface und fur Nicht-Objekt-Typen muss Type Alias verwendet werden."

Q: Wann sollte Interface und wann Type Alias verwendet werden?

"Interface verwenden bei: Definition von Objektstrukturen, Bedarf an Declaration Merging (z.B. Erweiterung von Drittanbieter-Typen), Definition von Klassenvertragen. Type Alias verwenden bei: Definition von Union- oder Intersection-Typen, Definition von Funktionstypen, Definition von Tupeln, Bedarf an Mapping- oder bedingten Typen. Kurz gesagt: Fur Objektstrukturen Interface bevorzugen, fur andere Typen Type Alias verwenden."

Reference