Tipos de datos en TypeScript (IV). Any y constantes

Vamos a dedicar esta entrada a unos conceptos muy simples respecto a los datos en TypeScript, pero que es necesario conocer. Ya sabemos que TypeScript es un lenguaje tipado (lo que, realmente, es un rasgo muy positivo). Sin embargo, en determinadas ocasiones, es necesario obviar ese tipado. Aquí veremos como hacerlo.

También sabemos como crear variables. Sin embargo, en algunos scripts es necesario contar con datos que no deben poderse modificar (ni siquiera de modo accidental) durante todo el ciclo de vida del script. Estos los creamos como constantes, lo que hace que si, una vez declarados, tratamos de modificar su valor, se produzca una excepción.

Vamos a ver ambas cuestiones.

LOS DATOS DE TIPO any

Ya sabemos que, cuando declaramos una variable en TypeScript, además de su valor (que podemos asignarlo en la declaración o no), establecemos su tipo, de modo que si, durante la programación, se le intenta asignar un valor de otro tipo, se produce un error de transpilación. Supongamos un script de TS como el siguiente:

Como ves, es muy simple. Declaramos un dato de tipo string en la primera línea, y en la tercera tratamos de darle un valor numérico. Al ejecutar el transpilador en la terminal de comandos obtenemos un mensaje muy explícito:

ts/tipos_any.ts(3,1): error TS2322: Type '1870' is not assignable to type 'string'.

Además, si empleamos un editor con marcado de errores, como Visual Studio Code, también nos aparece una indicación, con el nombre del archivo en rojo, indicándonos el error, tal como vemos a continuación:

El problema es que este es un tipo de error con el que el transpilador es muy tolerante. Nos muestra el mensaje que hemos visto, avisándonos del error pero, aún así, efectúa la transpilación. El código JavaScript obtenido es el siguiente:

ATENCIÓN. Esto se debe a que, aunque TypeScript es un lenguaje tipado, JavaScript no lo es. De hecho, como ves, en el código JS obtenido no aparece ninguna referencia a ningún tipo de dato, y el código final funciona en el navegador. Por esta razón, cuando transpilemos TypeScript es muy importante estar muy pendiente de los mensajes del transpilador.

Sin embargo, en determinadas ocasiones, es imprescindible «saltarse» el tipado. Para ello, lo que hacemos es declarar una (o más, claro) variable como de tipo any, así:

Esto transpila perfectamente, y sin ningún mensaje de advertencia. Una variable de tipo any puede contener datos de cualquier tipo, en cualquier momento.

Y ahora viene la pregunta obvia. Si TypeScript le da tanta importancia al tipado de datos, ¿por qué han incluido un tipo de datos que vale para todo? Aquí tengo que decirte lo que me enseña la experiencia. En la mayoría de los casos (yo te diría que en el 99%, y quizá me quede corto), lo que vale para todo, al final no sirve para nada. Sin embargo, existe un pequeño porcentaje de situaciones en las que debemos usar tipo universal como este. Cuando hablemos del uso de TypeScript en ciertos escenarios con Angular, NodeJS u otros contextos veremos que esto es necesario. De acuerdo. Es extremadamente poco frecuente, y debemos acostumbrarnos a no usar este «tipo» de dato de modo sistemático, pero cuando hace falta, hace falta.

CONSTANTES

Si declaramos un dato usando la palabra reservada const, en lugar de let o var, el valor debe ser asignado en la declaración, y no puede cambiarse en ningún momento. Supongamos un código TypeScript como el siguiente:

En la primera línea declaramos una constante. En este caso, especificar el tipo de dato podría ser innecesario, ya que su valor no puede cambiar, una vez declarada (por eso debemos asignarle un valor en la misma declaración). Sin embargo, es bueno que lo pongamos, a efectos documentales, y también de buenas prácticas.

Sin embargo, más adelante, intentamos reasignar un valor a un dato que hemos declarado como constante. El transpilador nos lanza un mensaje de advertencia, como el que se muestra a continuación:

ts/constantes.ts(4,1): error TS2540: Cannot assign to 'nombre' because it is a constant or a read-only property.

A pesar de ello, una vez más, la transpilación se efectúa, obteniendo el siguiente código JavaScript:

Afortunadamente, aquí las cosas no son tan fáciles. El navegador no «se lo traga», y en su consola nos muestra lo siguiente:

El nombre es: Nikola Tesla
Uncaught TypeError: Assignment to constant variable. at constantes.js:4

Como ves, esto produce un claro error en tiempo de ejecución. Entre esto, y el mensaje de advertencia del transpilador, ya deberíamos tener claro cual es la naturaleza de las constantes.

CONCLUYENDO

Con esto ya tenemos una visión de conjunto de los tipos simples de datos en TypeScript. En el próximo artículo empezaremos a ver tipos de datos complejos, como paso previo para el trabajo con objetos y clases, que es el punto fuerte de este lenguaje. Pero paciencia. Cada cosa a su tiempo. De momento, puedes descargar los scripts de prueba de este artículo en este enlace.

   

Deja un comentario