Las clases abstractas y las interfaces son dos conceptos fundamentales que permiten definir contratos y estructuras que otros componentes pueden implementar.

Resumen de Diferencias

Característica Clase Abstracta Interfaz
Métodos Puede tener métodos abstractos y concretos Solo métodos abstractos (sin implementación)
Herencia Herencia simple Implementación múltiple
Estado Puede contener variables de instancia No puede contener variables de instancia (solo declaraciones)
Constructores Puede tener constructores No puede tener constructores
Modificadores de Acceso Puede definir modificadores de acceso Métodos son implícitamente públicos

Conclusión

Clase Abstracta en TypeScript

Una clase abstracta en TypeScript es similar a las clases abstractas en otros lenguajes. No se puede instanciar directamente y puede contener tanto métodos abstractos (sin implementación) como métodos concretos (con implementación).

Ejemplo:


// Clase abstracta
abstract class Animal {
    abstract makeSound(): void; // Método abstracto

    sleep(): void { // Método concreto
        console.log("Sleeping...");
    }
}

// Clase concreta que extiende la clase abstracta
class Dog extends Animal {
    makeSound(): void {
        console.log("Bark");
    }
}

// Uso de la clase concreta
const myDog = new Dog();
myDog.makeSound(); // Salida: Bark
myDog.sleep();     // Salida: Sleeping...

Interfaz en TypeScript

Una interfaz en TypeScript define un contrato que las clases pueden implementar. Solo contiene declaraciones de métodos y propiedades, sin implementación. Las clases que implementan una interfaz deben proporcionar la implementación de los métodos definidos en la interfaz.

Ejemplo:


// Interfaz
interface Pet {
    play(): void;
}

// Clase concreta que implementa la interfaz
class Cat implements Pet {
    play(): void {
        console.log("Playing with a ball of yarn");
    }
}

// Uso de la clase que implementa la interfaz
const myCat = new Cat();
myCat.play(); // Salida: Playing with a ball of yarn