🥇 Classes, Generics (generics dentro de clases)

Las clases al igual que las interfaces, pueden ser genéricas. Cuando una clase es instanceada con el constructor new, su tipo es inferido de la misma forma que cuando se llama a una función.

class Caja<T> {
  contenido: T;

  constructor(value: T) {
    this.contenido = value;
  }
}

type Juguete = {
  nombre: string;
};

const misJuguetes: Juguete[] = [];
misJuguetes.push({ nombre: "Pelota" });
misJuguetes.push({ nombre: "Consola" });

const miCajaDeJuguetes: Caja<Juguete[]> = new Caja(misJuguetes);

type Maquillaje = {
  nombre: string;
};

const miMaquillaje: Maquillaje[] = [];
miMaquillaje.push({ nombre: "Sombras" });
miMaquillaje.push({ nombre: "Labial" });

const miCajaDeMaquillaje: Caja<Maquillaje[]> = new Caja(miMaquillaje);

Las clases pueden utilizar restricciones y valores por default de la misma forma que las interfaces.

🥤 Types en parámetros de clases estáticas

El siguiente código generará un error…

class Caja<T> {
    static valorPorDefault: T; // <- Static members cannot reference class type parameters.
}

Los elementos estáticos de una clase genérica nunca pueden ser referidos a parámetros de tipo ya que generan un error en tiempo de ejecución.