TypeScript de Cero a Experto / Genéricos
Reto: un repositorio genérico y tipado
El reto que junta el módulo: una clase genérica con constraint que puede almacenar
CUALQUIER tipo de entidad —siempre que tenga un id— y devolver resultados tipados
con Resultado<T>. Es el patrón de un repositorio en memoria, el corazón de la
capa de datos de miles de aplicaciones. Genéricos, constraints y discriminated
unions, trabajando juntos.
Reto
El repositorio genérico
Qué debes construir
Un Repositorio<T> reutilizable para cualquier entidad con id. Al ejecutarse
debe imprimir EXACTAMENTE:
Guardados: 3 items
Encontrado: Bus ($ 2800)
Buscar 99: No existe el id 99
Tras borrar id 1: 2 items
Requisitos:
type Resultado<T>: la discriminated union genérica{ ok: true; datos: T } | { ok: false; error: string }.class Repositorio<T extends { id: number }>: la constraint garantiza que toda entidad tengaid. Guarda los items en un array PRIVADO.- Métodos:
agregar(item: T): voidbuscar(id: number): Resultado<T>— devuelve{ ok: true, datos }si existe, o{ ok: false, error: "No existe el id X" }si no.borrar(id: number): void- un getter
cantidad: number
- El guion: crea un
Repositorio<Gasto>, agrega tres gastos, busca uno existente (id 2) y uno inexistente (id 99) manejando elResultadocon narrowing, borra el id 1, e imprime la cantidad final.
Reglas
- La constraint
T extends { id: number }es obligatoria (es lo que permite buscar poriddentro de la clase genérica). buscardevuelveResultado<T>, y el guion lo maneja conif (r.ok).- El array de items es privado. Nada de
any. Salida exacta.
30:00
Cuando estés listo, arranca el reloj.
Qué sigue
Módulo 5 cerrado: los genéricos ya no te intimidan —los escribes en funciones,
interfaces y clases, con constraints y defaults. El módulo 6 te da un regalo que
esos genéricos hicieron posible: los UTILITY TYPES. TypeScript trae docenas de
transformadores de tipos ya hechos —Partial, Pick, Omit, Record— que te
ahorran escribir a mano lo que ahora entiendes por dentro.