Type, oder Interface, Das ist die Frage (in TypeScript)
Min-jun Kim
Dev Intern · Leapcell

In TypeScript werden sowohl type als auch interface verwendet, um Typen zu definieren, und in vielen Fällen sind sie austauschbar. Sie haben jedoch einige wesentliche Unterschiede und spezifische Anwendungsfälle. Bevor wir uns mit den Unterschieden zwischen type und interface befassen, wollen wir uns zunächst ihre grundlegende Verwendung ansehen.
1. Grundlegende Verwendung: Definieren von Objekttypen mit type und interface
// Verwenden von interface interface User { name: string; age: number; } // Verwenden von type type UserType = { name: string; age: number; }; const user1: User = { name: 'Alice', age: 25 }; const user2: UserType = { name: 'Bob', age: 30 };
In diesem Beispiel können sowohl interface als auch type einen Objekttyp definieren, und es gibt fast keinen Unterschied in der Verwendung.
2. Erweiterung (Extend)
2.1 Erweitern von interface
interface kann durch Vererbung erweitert werden:
interface User { name: string; age: number; } interface Admin extends User { role: string; } const admin: Admin = { name: 'Alice', age: 30, role: 'Administrator', };
2.2 Erweitern von type
type kann durch Schnittmengentypen erweitert werden:
type UserType = { name: string; age: number; }; type AdminType = UserType & { role: string; }; const adminType: AdminType = { name: 'Bob', age: 35, role: 'Admin', };
Unterschied:
interfaceverwendet das Schlüsselwortextendsfür die Vererbung.typeverwendet&(Schnittmengentypen) zur Erweiterung.
3. Deklarationsverschmelzung
3.1 Deklarationsverschmelzung mit interface
interface erlaubt mehrere Deklarationen mit dem gleichen Namen. TypeScript wird ihre Member automatisch zusammenführen.
interface User { name: string; } interface User { age: number; } const user: User = { name: 'Alice', age: 25 }; // Die zusammengeführte User-Schnittstelle enthält sowohl Name- als auch Alterseigenschaften.
3.2 type unterstützt keine Deklarationsverschmelzung
type erlaubt keine doppelten Deklarationen, und dies führt zu einem Fehler.
type UserType = { name: string; }; // Die erneute Deklaration desselben Typs führt zu einem Fehler type UserType = { age: number; // Fehler: Doppelter Bezeichner 'UserType'. };
Unterschied:
interfaceunterstützt die Deklarationsverschmelzung, wodurch mehrere Deklarationen kombiniert werden können.typeunterstützt keine Deklarationsverschmelzung.
4. Union-Typen und Schnittmengentypen
4.1 type unterstützt Union- und Schnittmengentypen
type unterstützt die Definition von Union- und Schnittmengentypen, was interface nicht tut.
// Union-Typ type Status = 'success' | 'error' | 'loading'; // Schnittmengentyp type Name = { name: string }; type Age = { age: number }; type Person = Name & Age; const person: Person = { name: 'Alice', age: 25 };
4.2 interface unterstützt keine Union-Typen
interface kann Union-Typen nicht direkt definieren.
// Nicht unterstützt interface Status = "success" | "error" | "loading"; // Fehler
Unterschied:
typeunterstützt Union- und Schnittmengentypen und ist daher flexibler bei der Kombination mehrerer Typen.interfacekann keine Union-Typen definieren, kann aber Objekttypen erweitern.
5. Typ-Alias
type kann Aliase für verschiedene Typen definieren, einschließlich primitiver Typen, Tupel, Union-Typen usw.
// Definieren grundlegender Typ-Alias type ID = number | string; // Definieren eines Tupel-Typs type Point = [number, number]; const id: ID = 123; const point: Point = [10, 20];
interface hingegen kann nur Objekttypen definieren.
6. Implementierung (Implements) und Erweiterung (Extends)
6.1 interface für die Klassenimplementierung
interface kann die Struktur einer Klasse einschränken.
interface User { name: string; age: number; } class Person implements User { name: string; age: number; constructor(name: string, age: number) { this.name = name; this.age = age; } }
6.2 type kann auch Klassen einschränken
Obwohl interface häufig für diesen Zweck verwendet wird, kann type eine ähnliche Funktionalität erreichen.
type UserType = { name: string; age: number; }; class PersonType implements UserType { name: string; age: number; constructor(name: string, age: number) { this.name = name; this.age = age; } }
Unterschied:
interfacewird aufgrund seiner Fähigkeit, Deklarationen zusammenzuführen und Typen auf natürlichere Weise zu erweitern, häufiger im Klassendesign verwendet.typekann auch Klassen einschränken, eignet sich aber besser für die Definition von Unions und komplexen Typzusammensetzungen.
7. Interoperabilität
7.1 interface und type können gemischt werden
interface und type können in der Praxis kombiniert werden. So kann beispielsweise eine interface einen type erweitern und umgekehrt.
type Name = { name: string }; interface User extends Name { age: number; } const user: User = { name: 'Alice', age: 25 };
7.2 type kann interface erweitern
interface User { name: string; age: number; } type Admin = User & { role: string; }; const admin: Admin = { name: 'Bob', age: 35, role: 'Admin' };
Unterschied:
interfacekanntypeerweitern undtypekanninterfaceerweitern, wodurch sie flexibel kombiniert werden können.
8. Ausdrücken komplexer Typen
8.1 type bietet eine größere Ausdruckskraft
Da type Union-Typen, Schnittmengentypen und Typ-Alias unterstützt, ist es flexibler bei der Definition komplexer Typzusammensetzungen.
type ComplexType = string | number | { name: string }; const value1: ComplexType = 'Hello'; // Gültig const value2: ComplexType = 123; // Gültig const value3: ComplexType = { name: 'Alice' }; // Gültig
8.2 interface ist besser für Objektstrukturen
interface konzentriert sich auf die Beschreibung von Objektstrukturen und ist weniger geeignet für Union- oder komplexe Typkombinationen.
9. Zusammenfassung der Anwendungsfälle
Wann interface verwenden:
- Definieren von Objekttypen, insbesondere im objektorientierten Design.
- Einschränken von Klassen mit
implements. - Szenarien, die eine Deklarationsverschmelzung erfordern (z. B. Typdefinitionen von Drittanbieterbibliotheken).
Wann type verwenden:
- Definieren von Union-Typen, Schnittmengentypen und anderen komplexen Zusammensetzungen.
- Erstellen von Aliasen für primitive Typen und Tupel.
- Szenarien, die mehr Flexibilität bei der Kombination von Typen erfordern.
Fazit
interface
- Definieren von Objekttypen: ✅
- Alias für grundlegende Typen: ❌
- Deklarationsverschmelzung: ✅
- Erweiterung:
extends-Vererbung - Union-Typen: ❌
- Schnittmengentypen: ❌
- Klassenimplementierung: ✅
- Ausdrucksfähigkeit: Geeignet für Objektstrukturdefinitionen
- Häufiger Anwendungsfall: Objektorientiertes Design, Kombinieren von Klassen mit Schnittstellen
type
- Definieren von Objekttypen: ✅
- Alias für grundlegende Typen: ✅
- Deklarationsverschmelzung: ❌
- Erweiterung:
&-Schnittmengentypen - Union-Typen: ✅
- Schnittmengentypen: ✅
- Klassenimplementierung: ✅ (aber weniger verbreitet)
- Ausdrucksfähigkeit: Geeignet für komplexe Typzusammensetzungen
- Häufiger Anwendungsfall: Union-Typen, komplexe Typdefinitionen, Typ-Alias usw.
Insgesamt ist interface besser für die objektorientierte Programmierung geeignet, insbesondere im Klassendesign und in der Vererbung. Andererseits ist type flexibler und ideal für Szenarien, die komplexere Typzusammensetzungen und Typ-Alias erfordern. In den meisten Projekten können interface und type sich ergänzend verwendet werden.
Wir sind Leapcell, Ihre erste Wahl für das Hosting von Node.js-Projekten.
Leapcell ist die Serverless-Plattform der nächsten Generation für Webhosting, asynchrone Aufgaben und Redis:
Multi-Sprachen-Unterstützung
- Entwickeln Sie mit Node.js, Python, Go oder Rust.
Stellen Sie unbegrenzt Projekte kostenlos bereit
- Zahlen Sie nur für die Nutzung - keine Anfragen, keine Gebühren.
Unschlagbare Kosteneffizienz
- Pay-as-you-go ohne Leerlaufgebühren.
- Beispiel: 25 US-Dollar unterstützen 6,94 Millionen Anfragen bei einer durchschnittlichen Antwortzeit von 60 ms.
Optimierte Entwicklererfahrung
- Intuitive Benutzeroberfläche für mühelose Einrichtung.
- Vollautomatische CI/CD-Pipelines und GitOps-Integration.
- Echtzeitmetriken und -protokollierung für umsetzbare Erkenntnisse.
Mühelose Skalierbarkeit und hohe Leistung
- Automatische Skalierung zur einfachen Bewältigung hoher Parallelität.
- Null Betriebsaufwand - konzentrieren Sie sich einfach auf das Bauen.
Weitere Informationen finden Sie in der Dokumentation!
Folgen Sie uns auf X: @LeapcellHQ



