En TypeScript, tenemos dos formas principales de definir la estructura y comportamiento de nuestros objetos: interfaces y clases. Ambas tienen sus propias ventajas y situaciones en las que son más apropiadas. En este artículo, exploraremos las diferencias entre interfaces y clases, y cuándo y cómo utilizar cada una de ellas.
Las interfaces en TypeScript son una forma de definir la estructura de un objeto. Nos permiten describir las propiedades y métodos que un objeto debe tener sin proporcionar una implementación concreta. En otras palabras, las interfaces definen un contrato que los objetos deben cumplir.
La declaración de una interfaz en TypeScript es bastante sencilla. Podemos utilizar la palabra clave interface
seguida del nombre de la interfaz y las propiedades y métodos que queremos definir.
interface Persona {
nombre: string;
edad: number;
saludar(): void;
}
En este ejemplo, hemos creado una interfaz llamada Persona
que define las propiedades nombre
y edad
, y el método saludar()
. Cualquier objeto que implemente esta interfaz deberá tener estas propiedades y métodos.
Una vez que hemos definido una interfaz, podemos implementarla en una clase. La implementación de una interfaz en una clase se realiza utilizando la palabra clave implements
.
class Estudiante implements Persona {
nombre: string;
edad: number;
constructor(nombre: string, edad: number) {
this.nombre = nombre;
this.edad = edad;
}
saludar() {
console.log(`Hola, mi nombre es ${this.nombre}`);
}
}
En este ejemplo, la clase Estudiante
implementa la interfaz Persona
. Esto significa que la clase debe tener las propiedades nombre
y edad
, y el método saludar()
. La implementación de la interfaz nos asegura que la clase cumple con el contrato definido por la interfaz.
Las interfaces son especialmente útiles cuando queremos definir un contrato que varios objetos deben cumplir. Por ejemplo, si tenemos diferentes clases que representan diferentes tipos de animales, podemos definir una interfaz Animal
que describa las propiedades y métodos comunes a todos los animales.
interface Animal {
nombre: string;
edad: number;
hacerSonido(): void;
}
Luego, podemos implementar esta interfaz en las clases Perro
, Gato
y Pájaro
, asegurando que todas estas clases tengan las propiedades y métodos definidos en la interfaz Animal
.
class Perro implements Animal {
nombre: string;
edad: number;
constructor(nombre: string, edad: number) {
this.nombre = nombre;
this.edad = edad;
}
hacerSonido() {
console.log('Guau guau');
}
}
class Gato implements Animal {
nombre: string;
edad: number;
constructor(nombre: string, edad: number) {
this.nombre = nombre;
this.edad = edad;
}
hacerSonido() {
console.log('Miau');
}
}
class Pajaro implements Animal {
nombre: string;
edad: number;
constructor(nombre: string, edad: number) {
this.nombre = nombre;
this.edad = edad;
}
hacerSonido() {
console.log('Pío pío');
}
}
Las interfaces tienen varios beneficios en TypeScript:
Las clases en TypeScript son una forma de definir objetos con propiedades y métodos. A diferencia de las interfaces, las clases pueden proporcionar una implementación concreta de los métodos y propiedades que definen.
Para declarar una clase en TypeScript, utilizamos la palabra clave class
seguida del nombre de la clase y las propiedades y métodos que queremos definir.
class Coche {
marca: string;
modelo: string;
año: number;
constructor(marca: string, modelo: string, año: number) {
this.marca = marca;
this.modelo = modelo;
this.año = año;
}
acelerar() {
console.log('El coche está acelerando');
}
}
En este ejemplo, hemos declarado una clase Coche
con las propiedades marca
, modelo
y año
, y el método acelerar()
. La clase también tiene un constructor que se utiliza para inicializar las propiedades cuando se crea un nuevo objeto de la clase.
Las clases son útiles cuando queremos crear objetos con propiedades y métodos concretos. Podemos crear instancias de una clase utilizando la palabra clave new
.
const miCoche = new Coche('Toyota', 'Corolla', 2022);
miCoche.acelerar();
En este ejemplo, hemos creado una instancia de la clase Coche
llamada miCoche
y luego hemos llamado al método acelerar()
en esa instancia.
Las clases tienen varios beneficios en TypeScript:
La elección entre interfaces y clases depende del contexto y de lo que queremos lograr. Aquí hay algunas pautas generales:
En muchos casos, es posible utilizar tanto interfaces como clases en TypeScript. Por ejemplo, podemos utilizar una interfaz para definir la estructura de un objeto y luego implementarla en una clase para proporcionar una implementación concreta de los métodos y propiedades.