Type Manipulation, Class Types en Generics

Cuando creamos factories (fábricas) en TypeScript utilizando generics, se hace necesario referirse al tipo de las clases mediante sus constructores.

function crear<T>(c: { new (): T }): T {
    return new c();
}

const fecha = crear(Date);
console.log(fecha.toISOString());

Salida…

2021-04-15T12:55:46.506Z

Un ejemplo mas avanzado es el uso de la propiedad prototype para inferir y restringir las relaciones entre la función constructor y el tipo de la instancia.

class Apicultor {
    usaMascara: boolean;
}

class Zoologo {
    nombre: string;
}

class Animal {
    patas: number;
}

class Abeja extends Animal {
    cuidador: Apicultor;
}

class Leon extends Animal {
    cuidador: Zoologo;
}

function crearInstancia<A extends Animal>(c: new () => A): A {
    return new c();
}

console.log(crearInstancia(Leon).cuidador.nombre);
console.log(crearInstancia(Abeja).cuidador.usaMascara);

Este patrón es utilizado por para dar lugar al patrón de diseño mixins.