Quelle est la différence entre ces déclarations (interface vs type)?
interface X {
a: number
b: string
}
type X = {
a: number
b: string
};
typescript
wonea
la source
la source
Réponses:
Selon la spécification du langage TypeScript :
La spécification poursuit en mentionnant:
la source
interface Point { x: number; } interface Point { y: number; }
extends or implements
n'est plus le cas. Le type peut être étendu et implémenté par aclass
. Voici un exemple typescriptlang.org/play/…Mise à jour 2019
Les réponses actuelles et la documentation officielle sont obsolètes. Et pour ceux qui découvrent TypeScript, la terminologie utilisée n'est pas claire sans exemples. Vous trouverez ci-dessous une liste des différences à jour.
1. Objets / fonctions
Les deux peuvent être utilisés pour décrire la forme d'un objet ou une signature de fonction. Mais la syntaxe diffère.
Interface
Alias de type
2. Autres types
Contrairement à une interface, l'alias de type peut également être utilisé pour d'autres types tels que les primitives, les unions et les tuples.
3. Étendre
Les deux peuvent être étendus, mais encore une fois, la syntaxe diffère. En outre, notez qu'une interface et un alias de type ne s'excluent pas mutuellement. Une interface peut étendre un alias de type et vice versa.
L'interface étend l'interface
L'alias de type étend l'alias de type
L'interface étend l'alias de type
L'alias de type étend l'interface
4. Instruments
Une classe peut implémenter une interface ou un alias de type, les deux de la même manière exacte. Notez cependant qu'une classe et une interface sont considérées comme des plans statiques. Par conséquent, ils ne peuvent pas implémenter / étendre un alias de type qui nomme un type d'union.
5. Fusion de la déclaration
Contrairement à un alias de type, une interface peut être définie plusieurs fois et sera traitée comme une interface unique (les membres de toutes les déclarations étant fusionnés).
la source
type
ouinterface
? Je ne sais toujours pas quand je devrais utiliser l'un ou l'autre.Depuis TypeScript 3.2 (novembre 2018), ce qui suit est vrai:
la source
type
de certaines limitations (et à partir de TypeScript 3.7, ces limitations ont également disparu). Les interfaces peuvent étendre les types. Les classes peuvent implémenter des types. De plus, la présentation des données sous forme de capture d'écran d'un tableau les rend complètement inaccessibles aux personnes malvoyantes.https://www.typescriptlang.org/docs/handbook/advanced-types.html
la source
Exemples avec types:
// crée une arborescence pour un objet. Vous ne pouvez pas faire la même chose avec l'interface en raison du manque d'intersection (&)
// tapez pour restreindre une variable pour n'affecter que quelques valeurs. Les interfaces n'ont pas d'union (|)
// grâce aux types, vous pouvez déclarer un type NonNullable grâce à un mécanisme conditionnel.
Exemples avec interface:
// vous pouvez utiliser l'interface pour la POO et utiliser des 'implements' pour définir le squelette objet / classe
// vous pouvez étendre les interfaces avec d'autres interfaces
la source
En plus des réponses brillantes déjà fournies, il existe des différences notables en ce qui concerne l' extension des types par rapport aux interfaces. J'ai récemment rencontré quelques cas où une interface ne peut pas faire le travail:
la source
la documentation a expliqué
Interfaces et alias de type
la source