Las interfaces tienen cero impacto en JS en tiempo de ejecución. Hay mucho poder en las interfaces de TypeScript para declarar la estructura de las variables.
Las dos siguientes son declaraciones equivalentes, la primera utiliza una anotación inline, la segunda utiliza una interfaz:
// Sample Adeclare var myPoint: { x: number; y: number; };// Sample Binterface Point {x: number; y: number;}declare var myPoint: Point;
Sin embargo, la belleza de la muestra B es que si alguien crea una biblioteca que se basa en la biblioteca myPoint
para añadir nuevos miembros, puede añadir fácilmente a la declaración existente de myPoint
:
// Lib a.d.tsinterface Point {x: number; y: number;}declare var myPoint: Point;// Lib b.d.tsinterface Point {z: number;}// Your codevar myPoint.z; // Allowed!
Esto se debe a que las interfaces en TypeScript son abiertas. Este es un principio vital de TypeScript que le permite imitar la extensibilidad de JavaScript usando interfaces.
Las clases pueden implementar interfaces
Si quieres usar clases que deben seguir una estructura de objetos que alguien declaró para ti en un interface
puedes usar la palabra clave implements
para asegurar la compatibilidad:
interface Point {x: number; y: number;}class MyPoint implements Point {x: number; y: number; // Same as Point}
Básicamente en presencia de ese implements
, cualquier cambio en esa interfaz externa Point
resultará en un error de compilación en tu base de código para que puedas mantenerlo fácilmente sincronizado:
interface Point {x: number; y: number;z: number; // New member}class MyPoint implements Point { // ERROR : missing member `z`x: number; y: number;}
Nota que implements
restringe la estructura de las instancias de la clase i.e.:
var foo: Point = new MyPoint();
Y cosas como foo: Point = MyPoint
no es lo mismo.
No toda interfaz es implementable fácilmente
Las interfaces están diseñadas para declarar cualquier estructura arbitrariamente loca que pueda estar presente en JavaScript.
Considera la siguiente interfaz en la que algo es invocable con new
:
interface Crazy {new (): {hello: number};}
Esencialmente tendrías algo como:
class CrazyClass implements Crazy {constructor() {return { hello: 123 };}}// Becauseconst crazy = new CrazyClass(); // crazy would be {hello:123}
Puedes declarar todas las locuras de JS que hay con interfaces e incluso usarlas con seguridad desde TypeScript. No significa que puedas usar clases de TypeScript para implementarlas.