Nueva versión TypeScript, mejoras y algunos problemas

El pasado 5 de diciembre ha visto la luz la versión 0.9.5 de TypeScript, el lenguaje de Microsoft que nos acerca un poco más el JavaScript del futuro (esperemos que no un futuro muy lejano) a través de un compilador que procesa nuestro código en TypeScript para generar código JavaScript totalmente compatible con los navegadores (y además bastante legible, todo sea dicho). Esto nos aporta evidentes beneficios a la hora de trabajar con JavaScript hoy, como el hecho de disponer de un lenguaje tipado, una sintaxis potente para el trabajo con OOP, con un enfoque más clásico que la que actualmente podemos reproducir con JavaScript, etc.

En alguna ocasión os habíamos hablado ya de este lenguaje que por aquí nos encanta y sobre el que pronto os podremos anunciar alguna novedad interesante en la que hemos estado metidos. Pero por desgracia cuando se trabaja con un lenguaje en fase BETA no todo son bondades, y las versiones nuevas en ocasiones traen regalos en forma de cambios en algunas decisiones del lenguaje que hace que nuestro código deje de compilar correctamente.

También tenemos que ser justos y decir que esta versión parece haber mejorado notablemente la velocidad de compilación, que ha sido uno de los principales caballos de batalla entre diferentes versiones del compilador. Por nuestra parte, que hayamos detectado en el último proyecto en el que estamos trabajado con TypeScript, nos ha afectado por un cambio en un criterio del compilador y por un cambio o bien en las definiciones de librerías de terceros, o bien en el propio compilador de TypeScript (no lo tenemos claro). Las dejamos aquí por si a alguno se choca contra ellas :)

Error usando el tipo Array
Este error ya se ha comentado en Definitely Typed, y parece estar provocado por un cambio en el control de tipos, que se ha endurecido. Algo tan sencillo como esto:

var lista:Array;

Arroja el error:

error TS2173: Generic type references must include all type arguments.

Solución:
La solución pasa por definir el array como any[] que es válido tanto para la versión 0.9.1.1 como para la 0.9.5, aunque evidentemente era bastante más cómodo poder definir con la palabra Array. No obstante este cambio va en al línea de que usemos arrays tipados, que para eso nos han metido tipos en el lenguaje… y si los queremos sin tipo, que lo indiquemos de forma explícita. Pero como digo, perfectamente podrían haber compatibilizado el uso de “Array”, con que internamente se interpretara por “any[]”.

Error usando el método proxy de jQuery
Este error lo hemos encontrado al usar un Delegate o $.proxy de jQuery. Algo como esto:

$('#elemento').on('keyup', $.proxy(this.miMetodo, this));

Arroja el error:

error TS2082: Supplied parameters do not match any signature of call target: 
Type '(eventObject: JQueryEventObject, ...args: any[]) => any' requires a call signature, but type 'Function' lacks one.

Solución:
Hemos probado a descargar la última versión de la definición de jquery para TypeScript, pero el error de compilación persiste.

En nuestro caso lo hemos solventado usando las arrow functions (página 56 de la especificación), que no dejan de ser un atajo para hacer una closure en JavaScript (puedes hacer pruebas parecidas aquí).

$('#elemento').on('keyup', (event) => this.miMetodo(event));