Abstracción
Enfocarse en qué debe hacer un objeto en lugar de cómo lo hace, utilizando interfaces y clases abstractas.
Abstracción
La Abstracción consiste en enfocarte en qué debe hacer un objeto en lugar de cómo lo hace por dentro.
En TypeScript, para aplicar la abstracción creamos contratos o plantillas. Esto sirve para asegurarte de que un conjunto de clases sigan exactamente las mismas reglas estructurales, independientemente de la lógica interna que cada una tenga.
Para lograr esto, tenemos dos herramientas principales: Interfaces (interface) y Clases Abstractas (abstract class).
1. Interfaces (interface / implements)
Una interfaz es un contrato 100% puro. Solo define la forma (propiedades y nombres de métodos) que una clase debe tener, sin escribir ni una sola línea de código ejecutable.
Características:
- Una clase usa la palabra
implementspara firmar la interfaz. - No genera código en JavaScript: Al compilar, TypeScript elimina las interfaces por completo. Solo sirven para validar tu código durante el desarrollo.
- Una clase puede implementar múltiples interfaces a la vez.
typescript// 1. EL CONTRATO: Exige un método 'enviar'
interface EnviadorNotificacion {
canal: string;
enviar(mensaje: string): boolean;
}
// 2. CLASE 1 QUE FIRMA EL CONTRATO
class EmailService implements EnviadorNotificacion {
canal = "Email";
// TypeScript te OBLIGA a implementar 'enviar' con esa misma firma
enviar(mensaje: string): boolean {
console.log(`[Email] Enviando: ${mensaje}`);
return true;
}
}
// 3. CLASE 2 QUE FIRMA EL MISMO CONTRATO
class SmsService implements EnviadorNotificacion {
canal = "SMS";
enviar(mensaje: string): boolean {
console.log(`[SMS] Enviando: ${mensaje}`);
return true;
}
}
2. Clases Abstractas (abstract class / extends)
Una clase abstracta es un híbrido entre un contrato y una clase normal. Sirve como modelo base para otras clases, con una restricción clave: NUNCA puedes hacer new NombreDeClaseAbstracta().
Características:
- Las clases hijas la usan con
extends. - Puede incluir código completo (métodos normales reutilizables) y métodos abstractos (firmas sin código que las hijas deben implementar sí o sí).
- Sí genera código en JavaScript: A diferencia de la interfaz, la clase abstracta sí existe como clase en JS al compilar.
- Una clase solo puede extender de una sola clase abstracta.
typescript// 1. CLASE BASE ABSTRACTA
abstract class BaseDeDatos {
// A. Método normal con código (se hereda directo a las hijas)
public conectar(): void {
console.log("Conectando a la base de datos...");
}
// B. Método abstracto (Sin código: obliga a las hijas a escribir su propia versión)
abstract guardarDatos(datos: string): void;
}
// 2. CLASE HIJA 1
class MongoRepository extends BaseDeDatos {
// Obligado a dar la implementación de guardarDatos
guardarDatos(datos: string): void {
console.log(`Guardando en MongoDB: ${datos}`);
}
}
// 3. CLASE HIJA 2
class PostgresRepository extends BaseDeDatos {
guardarDatos(datos: string): void {
console.log(`Guardando en PostgreSQL: ${datos}`);
}
}
// ❌ ERROR: No se puede instanciar una clase abstracta
// const db = new BaseDeDatos();
// ✅ CORRECTO:
const mongo = new MongoRepository();
mongo.conectar(); // Reutiliza el código de la clase abstracta
mongo.guardarDatos("Usuario Juan");