¿Cuál es la diferencia entre estas declaraciones (interfaz vs tipo)?
interface X {
a: number
b: string
}
type X = {
a: number
b: string
};
typescript
wonea
fuente
fuente
Respuestas:
Según la especificación del lenguaje TypeScript :
La especificación continúa mencionando:
fuente
interface Point { x: number; } interface Point { y: number; }
extends or implements
ya no es el caso. El tipo puede ser extendido e implementado por aclass
. Aquí hay un ejemplo typescriptlang.org/play/…Actualización 2019
Las respuestas actuales y la documentación oficial están desactualizadas. Y para aquellos nuevos en TypeScript, la terminología utilizada no está clara sin ejemplos. A continuación se muestra una lista de las diferencias actualizadas.
1. Objetos / funciones
Ambos se pueden usar para describir la forma de un objeto o una firma de función. Pero la sintaxis difiere.
Interfaz
Escriba alias
2. Otros tipos
A diferencia de una interfaz, el alias de tipo también se puede usar para otros tipos, como primitivas, uniones y tuplas.
3. Extender
Ambos se pueden extender, pero de nuevo, la sintaxis difiere. Además, tenga en cuenta que una interfaz y un alias de tipo no son mutuamente excluyentes. Una interfaz puede extender un alias de tipo, y viceversa.
La interfaz extiende la interfaz
El alias de tipo extiende el alias de tipo
La interfaz extiende el alias de tipo
El alias de tipo extiende la interfaz
4. Implementa
Una clase puede implementar una interfaz o un alias de tipo, ambos de la misma manera. Sin embargo, tenga en cuenta que una clase y una interfaz se consideran planos estáticos. Por lo tanto, no pueden implementar / extender un alias de tipo que nombre un tipo de unión.
5. Fusión de declaraciones
A diferencia de un alias de tipo, una interfaz se puede definir varias veces y se tratará como una única interfaz (con los miembros de todas las declaraciones fusionadas).
fuente
type
ointerface
? Todavía estoy confundido sobre cuándo debo usar uno u otro.A partir de TypeScript 3.2 (noviembre de 2018), lo siguiente es cierto:
fuente
type
con ciertas limitaciones (y a partir de TypeScript 3.7 estas limitaciones también se han eliminado). Las interfaces pueden extender tipos. Las clases pueden implementar tipos. Además, presentar datos como una captura de pantalla de una tabla hace que sea completamente inaccesible para las personas con problemas de visión.https://www.typescriptlang.org/docs/handbook/advanced-types.html
fuente
Ejemplos con tipos:
// crea una estructura de árbol para un objeto. No puede hacer lo mismo con la interfaz debido a la falta de intersección (&)
// escriba para restringir una variable para asignar solo unos pocos valores. Las interfaces no tienen unión (|)
// gracias a los tipos, puede declarar tipos no anulables gracias a un mecanismo condicional.
Ejemplos con interfaz:
// puedes usar la interfaz para OOP y usar 'implementos' para definir el esqueleto de objeto / clase
// puedes extender interfaces con otras interfaces
fuente
Además de las brillantes respuestas ya proporcionadas, existen diferencias notables cuando se trata de extender tipos frente a interfaces. Recientemente me encontré con un par de casos en los que una interfaz no puede hacer el trabajo:
fuente
la documentación ha explicado
Interfaces versus alias de tipo
fuente