Como soy torpe, me gusta TypeScript

Escribo esta entrada en Medium (la primera) para dar mi opinión sobre el reciente post de Eric Elliot con título You Might Not Need TypeScript (or Static Types).

Básicamente dice que después de usar TypeScript a tiempo completo durante varios meses en un proyecto, no le ha ayudado a ser más productivo ni a programar con menos errores.

Según Eric, las anotaciones de tipos crean más ruido sintáctico, y eso hace que el código sea más difícil de leer y de mantener. Es bastante curioso que diga esto porque precisamente ayer actualizaron una propuesta para incluir inferencia de tipos en Java y la gente se quejaba de que si no ponías el tipo en la declaración de las variables, el código era más difícil de leer y de entender, y por tanto de mantener ;) Como parece que hay controversia en la utilidad de los tipos todo se reduce a opiniones, mi opinión es que los tipos ayudan a entender y mantener el código.

Eric indica que escribir código TypeScript es más lento que en JavaScript. Concretamente dice que las siguientes construcciones son más complejas:

  • Generic functions & polymorphism
  • Higher order functions
  • Object composition

Efectivamente escribir funciones genéricas en TypeScript es más costoso que en JavaScript porque especificar el tipo de las funciones implica que tienes que conocer cómo hacerlo y mantener esas definiciones de tipos. Lo bueno de TypeScript es que no tienes por qué hacerlo. Puedes usar el tipo “any” cuando la cosa se complica. Tu decides el precio que pagar por la ayuda que obtienes. Si quieres que TypeScript te ayude, tú le tienes que explicar las cosas con más cuidado. Si en ciertos casos consideras que no merece la pena el coste para la ayuda… no uses tipos en ese punto concreto. Programarás como en JavaScript. Por tanto, una parte opcional no puede ser un problema. Y si usas constantemente funciones genéricas, entonces te merecerá la pena leer la documentación para saber cómo especificar el tipo de las funciones ;)

También indica que con TypeScript no tendrás menos bugs. Totalmente de acuerdo. Si eres un buen programador y no eres un torpe como yo, TypeScript no te ayudará mucho. A mi me ayuda porque me avisa cuando me equivoco al escribir, sin tener que esperar a ejecutar para obtener el feedback de runtime. Es cierto que en JavaScript habría detectado el mismo error al ejecutar el programa, pero con TypeScript simplemente voy más rápido porque soluciono mis torpezas nada mas cometerlas, no al cabo de un rato.

En el artículo menciona la relación entre el duck typing de los lenguajes dinámicos y la compatibilidad de tipos estructural y nominal. Como TypeScript tiene compatibilidad de tipos estructural, que se asemeja al duck typing, no entiendo exactamente el problema que tiene. Dice que es un problema en Java y C++… y a mi qué me cuentas??? ;)

Eric dice que el 99% de la ayuda que te proporciona TypeScript te la podría proporcionar Flow que analiza tu código JavaScript estándar. Esto me parece bastante curioso porque creo que es mucho más del 1%. Creo que todo depende de lo torpe que seas… a mi me ayuda mucho más del 1%, sobre todo cuando llamo a funciones y declaro el tipo de los parámetros, cosa que flow no infiere por ti (creo).

Respecto al refactoring, Eric indica que Tern.js y Flow te pueden ayudar mucho con la refactorización. Cosa que me sorprende si no especificas el tipo de los parámetros de una función en una librería porque no sabría qué valores potenciales puede recibir. Pero quizás no conozca Tern.js y Flow lo suficiente. Lo que más me mola es lo que dice de que puede contar con los dedos de la mano el número de veces que ha tenido que hacer refactorizaciones en las que haya tardado más de algunos pocos minutos y que realmente le hubiese ayudado un lenguaje con tipado estático. Definitivamente somos programadores diferentes. Aquí es donde se nota mi torpeza. Yo me siento muy poco cómodo refactorizando código JavaScript por la falta de red seguridad que tengo sin el “compilador” de un lenguaje con tipado estático. Hay gente que se siente super cómoda y con sus tests puede considerar que el compilador es redundante, pero mi cerebro no es así. Desde luego admiro a los desarrolladores que son más productivos con lenguajes dinámicos. Yo es que soy bastante torpe y a mi el compilador, como primera línea de apoyo, me ayuda mucho.

Respecto al autocompletar, indica que con Tern.js o Flow todo se autocompleta. Pues entonces será que yo no soy capaz de configurar un mísero plugin de Tern.js o Flow. Aunque me extraña que me autocomplete los métodos de un objeto que recibo como parámetro cuando todavía no he usado esa función en ninguna parte del programa… me leerá la mente?

Menos mal que en la sección de conclusiones ya me dice lo que yo estoy pensando, que en TypeScript las herramientas son mejores y los errores son mucho más descriptivos que en Tern.js o en Flow. Según él, porque los IDEs de Tern.js y Flow simplemente están peor implementados, porque que podrían estar a la par perfectamente. Cosa que no comparto. En TypeScript los errores dan más información porque tienen más información sobre el código.

Al final acaba diciendo que la curva de aprendizaje de TypeScript es importante (totalmente de acuerdo) y que hay equipos que a lo mejor no tienen los recursos para afrontarla. Cosa que puede ser razonable. Pero no sé yo qué curva será más pronunciada, si la de un programador JavaScript que tiene que aprender TypeScript o la de un programador Java/C# que tiene que aprender JavaScript. Yo creo que es más pronunciada la segunda. Es más, para un desarrollador Java/C# posiblemente TypeScript les parecerá un lenguaje más fácil de usar que JavaScript. Por tanto este argumento depende mucho del contexto.

En resumen, se pregunta si TypeScript merece la pena por el coste que tiene su uso frente a las nimias ventajas. Para mi si merece la pena porque yo creo que me ayuda mucho más que ese 1% que él indica.

Mi propia conclusión es que mira que me extraña que Tern.js y Flow sean capaces de ofrecerte lo mismo que te ofrece TypeScript sin tener que poner el tipo por ningún sitio. Si eso fuera cierto, yo me pregunto… entonces los de TypeScript son tan torpes como yo que no han podido copiar a Tern.js y a Flow? Porque sería bastante absurdo complicar las cosas innecesariamente por el placer de complicarlas si todo se puede hacer con código JavaScript estándar, no?

Lamentablemente, de nuevo parece que es muy complicado hablar de las bondades de una herramienta de forma completamente agnóstica al usuario que la va a usar. Posiblemente para Eric TypeScript no merezca la pena… pero para un programador torpe como yo, cada segundo invertido en especificar el tipo, lo gano con creces por tener la compañía del compilador ;)

Show your support

Clapping shows how much you appreciated Micael Gallego’s story.