Dans Typescript, quelle est la différence entre le type et l'interface?


114

Quelles sont les différences entre les éléments suivants?

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

3
le type ne peut pas être étendu comme l'extension d'interface. les types ne sont que des alias pour un type.
PSL


2
J'utilise principalement le type pour les données externes, par exemple à partir d'un fichier JSON, ou si vous n'écrivez que des fonctions sans utiliser de classes OOP.
Kokodoko

1
J'ai trouvé cet article utile qui explique les différences - medium.com/@martin_hotell/…
Sandeep GB

1
La réponse acceptée est obsolète. Explication mise à jour publiée ici (puisque ce fil semble être favorisé par Google): stackoverflow.com/questions/37233735/…
jabacchetta

Réponses:


125

Les interfaces peuvent être étendues

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

et aussi augmenté

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

Les alias de type, cependant, peuvent représenter certaines choses que les interfaces ne peuvent pas

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

Donc, en général, si vous n'avez qu'un type d'objet simple, comme indiqué dans votre question, une interface est généralement une meilleure approche. Si vous avez envie d'écrire quelque chose qui ne peut pas être écrit en tant qu'interface, ou si vous voulez simplement donner à quelque chose un nom différent, un alias de type est préférable.


3
Type aliases, however, can represent some things interfaces can'tIl me semble vos exemples NeatAndCoolet JustSomeOtherNamepeut être créé comme interface qui étend l'existant Neat, Coolou les SomeTypetypes.
Rudey

En effet les deuxième et troisième exemples peuvent être créés avec une interface:interface NeatAndCool extends Neat, Cool {} interface JustSomeOtherName extends SomeType {}
peterjwest

3
L'extension de deux interfaces ne produira pas toujours le même résultat qu'un type d'intersection, et tous les types ne peuvent pas être étendus (alors que tous les types peuvent être aliasés ou mis en unions / intersections)
Ryan Cavanaugh

1
Alors quel est l'avantage du type? Peut-on dire quand on a une interface, le type n'est pas utile?
Mostafa Saadatnia

4

En outre, une interface peut être implémentée .


1
Et un objet peut implémenter plusieurs interfacesclass Thing implements Neat, Cool
Kokodoko

1
Que voulez-vous dire ? également Type can b implémenté
nadav

3
Cela devrait être un commentaire pas une réponse imo.
Michael Kunst

Cher Dave, vous devriez laisser un commentaire pas une réponse. Sur la base de cette réponse, votre réponse n'est pas exactement la bonne.
Mehrdad88sh

4

Les types sont un peu comme les interfaces et vice versa: les deux peuvent être implémentés par une classe. mais il y a quelques différences importantes: 1. lorsque Type est implémenté par une classe, les propriétés qui appartiennent au Type doivent être initialisées à l'intérieur de la classe, alors qu'avec Interface, elles doivent être déclarées. 2. comme @ryan l'a mentionné: l'interface peut étendre une autre interface. Les types ne peuvent pas.

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

Les différences entre ces derniers sont également déjà dans ce fil.

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

Ici type Fooet interface Foosemble presque similaire, donc c'est déroutant.

interfaceest le contrat que les propriétés suivantes (ici foo:string) doivent être présentes dans un objet. interfacen'est pas class. Il est utilisé lorsque la langue ne prend pas en charge l'héritage multiple. Il interfacepeut donc y avoir une structure commune entre différentes classes.

class Bar implements Foo {
    foo: string;
}

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

Mais typeet interfacesont utilisés dans un contexte très différent.

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

Ici typede fooest Fooet todayest Date. C'est comme une déclinaison de variable qui contient les informations de type d'une autre variable. typeest comme un sur-ensemble d'interfaces, de classes, de signature de fonction, d'autres types ou même de valeurs (comme type mood = 'Good' | 'Bad'). À la fin, typedécrit la structure ou la valeur possible d'une variable.


4

Il est faux de dire "les interfaces peuvent être implémentées" car les types peuvent également être implémentés

type A = { a: string };


class Test implements A {

    a: string;
}

Bien que vous puissiez le faire, vous ne pouvez pas implémenter un type qui est une union de types, ce qui est tout à fait logique honnêtement :)


4

type dans le dactylographie est utilisé pour référencer des types déjà existants . Il ne peut pas être prolongé comme interface. Exemples de type:

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

vous pouvez utiliser Rest and Spread dans les types:

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

L'interface, d'autre part, vous permet de créer un NOUVEAU TYPE.

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
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.