TypeScript es mi lenguaje principal y, con los años, ha dejado de ser una simple elección técnica para convertirse en un conjunto de valores. No son reglas de una guía de estilo, sino hábitos que deciden si una base de código seguirá siendo fácil de modificar después de dos años y tres nuevas incorporaciones.
Honestidad antes que comodidad. El modo estricto está activado desde el primer commit. any es un aviso de error, no un tipo; cuando de verdad desconozco la forma, uso unknown y la voy acotando. Un tipo que miente —un cast as para silenciar al compilador— es peor que no tener tipo, porque todo el código posterior confía en él. Si el compilador se queja, suele tener razón: la corrección está en los datos, no en la anotación.
Haz imposibles los estados imposibles. En lugar de isLoading, isError y data como tres indicadores capaces de contradecirse, uso una unión discriminada: idle, loading, success con datos, error con una causa. Lo mismo se aplica al dominio: un pedido pagado tiene paymentId; uno sin pagar, no. Un switch con comprobación exhaustiva mediante never convierte el caso olvidado —que podría ser un incidente en producción— en una línea roja en el editor.
Confía dentro, verifica en los límites. Los tipos desaparecen en tiempo de ejecución, así que todo lo que cruza una frontera —cuerpo HTTP, webhook, formulario, localStorage o respuesta de un LLM— se analiza con Zod u otro esquema similar, y el tipo se infiere de ese esquema. Una única fuente de verdad evita divergencias entre lo que validamos y lo que creemos. Dentro de la aplicación, los datos tipados fluyen sin comprobaciones defensivas en cada línea.
Comparte contratos, no conjeturas. En un producto full-stack, los tipos de API se generan o comparten desde OpenAPI, GraphQL Codegen, Prisma o un paquete común. Así, renombrar un campo rompe la compilación, no el checkout. La legibilidad vence a la astucia: una interfaz sencilla que alguien nuevo entiende en diez segundos vale más que un tipo condicional de cinco niveles que demuestra que leí el manual. Los genéricos sirven para reutilizar, no para presumir.
Los tipos no sustituyen las pruebas, las revisiones ni el razonamiento: abaratan los tres. Ese es el verdadero valor de un desarrollador de TypeScript: no saberse todos los utility types, sino dejar código que la siguiente persona pueda cambiar con confianza. Si tu código está lleno de any y el equipo teme refactorizar, envíame el módulo que nadie quiere tocar. Te diré cómo lo tiparía y qué errores detectaría.
Dale al próximo producto alguien que se quede.
¿Listo para empezar? Envíame un mensaje: puedo comenzar ahora y quedarme. Colaboraciones a largo plazo, no una entrega de dos semanas. Hablemos de tu proyecto, requisitos y la mejor forma de avanzar.