Was ist in Typescript der Unterschied zwischen Typ und Schnittstelle?


114

Was sind die Unterschiede zwischen den folgenden?

type Foo = { 
    foo: string 
};
interface Foo {
   foo: string;
}

3
Typ kann nicht wie Schnittstellenerweiterung erweitert werden. Typen sind nur Aliase für einen Typ.
PSL


2
Ich verwende meistens Typ für externe Daten, zum Beispiel aus einer JSON-Datei, oder wenn Sie nur Funktionen schreiben, ohne OOP-Klassen zu verwenden.
Kokodoko

1
Ich fand diesen Artikel nützlich, der die Unterschiede erklärt - medium.com/@martin_hotell/…
Sandeep GB

1
Die akzeptierte Antwort ist veraltet. Aktualisierte Erklärung hier veröffentlicht (da dieser Thread von Google bevorzugt zu sein scheint): stackoverflow.com/questions/37233735/…
jabacchetta

Antworten:


125

Schnittstellen können erweitert werden

interface A {
  x: number;
}
interface B extends A {
  y: string;
}

und auch erweitert

interface C {
  m: boolean;
}
// ... later ...
interface C {
  n: number;
}

Typ-Aliase können jedoch einige Dinge darstellen, die Schnittstellen nicht können

type NumOrStr = number | string;
type NeatAndCool = Neat & Cool;
type JustSomeOtherName = SomeType;

Wenn Sie also nur einen einfachen Objekttyp haben, wie in Ihrer Frage gezeigt, ist eine Schnittstelle im Allgemeinen ein besserer Ansatz. Wenn Sie etwas schreiben möchten, das nicht als Schnittstelle geschrieben werden kann, oder einfach etwas anders benennen möchten, ist ein Typalias besser.


3
Type aliases, however, can represent some things interfaces can'tEs scheint mir , Ihre Beispiele NeatAndCoolund JustSomeOtherNamekann als Schnittstelle , die die bestehenden erweitern erstellt werden Neat, Cooloder SomeTypeTypen.
Rudey

In der Tat können das zweite und dritte Beispiel mit einer Schnittstelle erstellt werden:interface NeatAndCool extends Neat, Cool {} interface JustSomeOtherName extends SomeType {}
Peterjwest

3
Das Erweitern von zwei Schnittstellen führt nicht immer zum gleichen Ergebnis wie ein Kreuzungstyp, und nicht alle Typen können erweitert werden (während alle Typen mit Alias ​​versehen oder in Gewerkschaften / Kreuzungen eingefügt werden können)
Ryan Cavanaugh,

1
Was ist der Vorteil des Typs? Können wir sagen, wenn wir eine Schnittstelle haben, ist der Typ nicht nützlich?
Mostafa Saadatnia

4

Es kann auch eine Schnittstelle implementiert werden .


1
Und ein Objekt kann mehrere Schnittstellen implementierenclass Thing implements Neat, Cool
Kokodoko

1
Was meinst du ? Auch Typ kann implementiert werden
Nadav

3
Dies sollte ein Kommentar sein, keine Antwort imo.
Michael Kunst

Lieber Dave, du solltest einen Kommentar hinterlassen, keine Antwort. Auch basierend auf dieser Antwort ist Ihre Antwort nicht genau richtig.
Mehrdad88sh

4

Types ähnelt Interfaces und umgekehrt: Beide können von einer Klasse implementiert werden. Es gibt jedoch einige wichtige Unterschiede: 1. Wenn Type von einer Klasse implementiert wird, müssen die Eigenschaften, die zum Type gehören, innerhalb der Klasse initialisiert werden, während sie bei Interface deklariert werden müssen. 2. wie @ryan erwähnt: Schnittstelle kann eine andere Schnittstelle erweitern. Typen können nicht.

type Person = {
    name:string;
    age:number;
}

// must initialize all props - unlike interface
class Manager implements Person {
    name: string = 'John';
    age: number = 55;

    // can add props and methods
    size:string = 'm';
}

const jane : Person = {
    name :'Jane',
    age:46,

    // cannot add more proprs or methods
    //size:'s'
}

4

Auch Unterschiede zwischen diesen gibt es bereits in diesem Thread.

type Foo = {
    foo: string
};
interface Foo {
    foo: string;
}

Hier type Foound interface Foosieht fast ähnlich aus, so ist es verwirrend.

interfaceist Vertrag, dass die folgenden Eigenschaften (hier foo:string) in einem Objekt vorhanden sein sollten. interfaceist nicht class. Es wird verwendet, wenn die Sprache die Mehrfachvererbung nicht unterstützt. So interfacekann eine gemeinsame Struktur zwischen verschiedenen Klassen sein.

class Bar implements Foo {
    foo: string;
}

let p: Foo = { foo: 'a string' };

Aber typeund interfacewerden in sehr unterschiedlichen Zusammenhängen eingesetzt.

let foo: Foo;
let today: Date = new Date();

Hier typeder fooist Foound todayist Date. Es ist wie eine Variablendekleration, die die Informationen des Typs einer anderen Variablen enthält. typeist wie eine Obermenge von Schnittstellen, Klassen, Funktionssignaturen, anderen Typen oder sogar Werten (wie type mood = 'Good' | 'Bad'). Am Ende typebeschreibt die mögliche Struktur oder den Wert einer Variablen.


4

Es ist falsch zu sagen, dass "Schnittstellen implementiert werden können", da auch Typen implementiert werden können

type A = { a: string };


class Test implements A {

    a: string;
}

Obwohl Sie dies tun können, können Sie keinen Typ implementieren, der eine Union von Typen ist, was ehrlich gesagt absolut sinnvoll ist :)


4

Der Typ im Typenskript wird verwendet, um auf bereits vorhandene Typen zu verweisen . Es kann nicht wie erweitert werden interface. Beispiele typesind:

type Money = number;
type FormElem = React.FormEvent<HTMLFormElement>;
type Person = [string, number, number];

Sie können Rest and Spread in folgenden Typen verwenden:

type Scores = [string, ...number[]];
let ganeshScore = ["Ganesh", 10, 20, 30]
let binodScore = ["Binod", 10, 20, 30, 40]

Mit der Schnittstelle können Sie dagegen einen NEUEN TYP erstellen.

interface Person{
  name: string,
  age: number, 
}

Interface can be extended with extends keyword.
interface Todo{
  text: string;
  complete: boolean;
}

type Tags = [string, string, string]

interface TaggedTodo extends Todo{
 tags: Tags
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.