TypeScript avanzado no es solo para mostrar. Los tipos genéricos, los mapped types y los utility types bien usados reducen código, previenen errores y mejoran la experiencia de quien usa tu código.
Genéricos: escribe una vez, usa muchas veces
Un genérico es una forma de parametrizar tipos. En lugar de escribir ListaDeUsers, ListaDeProductos, ListaDePedidos, escribes Lista<T> una vez.
El beneficio es que el mismo código funciona con cualquier tipo manteniendo la seguridad de tipos.
- Define T como placeholder para "cualquier tipo".
- Úsalo en funciones, clases e interfaces.
- TypeScript infiere el tipo en contexto.
Mapped types: transforma automáticamente estructuras
Un mapped type toma una estructura existente y produce una nueva derivada. Por ejemplo, convertir un objeto con campos a una versión con todos opcionales, o derivar un tipo del esquema de una base de datos.
El resultado es que cambios centrales se propagan automáticamente sin duplicación.
- Identifica el patrón que repites en múltiples tipos.
- Crea un mapped type que lo generalice.
- Reutiliza en lugar de duplicar.
Utility types que ahorran escritura
TypeScript incluye utilidades como Partial, Pick, Record y Omit que resuelven problemas comunes. Aprender a usarlas elimina boilerplate.
Keyof, typeof y las restricciones de genéricos te permiten manipular tipos dinámicamente.
- Partial<T>: todos los campos opcionales.
- Pick<T, K>: solo ciertos campos.
- Record<K, T>: diccionario tipado.
Errores que evitar cuando trabajas con tipos avanzados
El mayor riesgo es pensar que cualquier cosa se puede tipificar o sobrecomplicar el sistema. En realidad, los tipos más útiles son los más simples. Si no puedes explicar un tipo en una frase, probablemente es demasiado complejo.
Los tipos avanzados que realmente ayudan son aquellos que eliminan código, no los que lo hacen más sofisticado.
Cuándo usar estos patrones
Úsalos cuando el mismo patrón aparece múltiples veces. Si solo lo necesitas una vez, probablemente no merece abstraerlo. El criterio es DRY, pero aplicado inteligentemente.
Un tipo bien hecho se mantiene a sí mismo a medida que crece el código.