Introducción
Antes de analizar la aserción de tipos, debemos recordar que TypeScript tiene una inferencia de tipos, la cual es la capacidad de “deducir” cuál es el tipo de una variable sin necesidad de declararlo explícitamente. Sin embargo, esto tiene sus limitaciones, ya que debemos recordar que TypeScript no se ejecuta en tiempo de ejecución, lo que quiere decir que TypeScript no puede inferir el tipo de datos que recién se van a “recuperar” en tiempo de ejecución.
El problema de la inferencia de tipos en TypeScript
Por ejemplo, al hacer un getElementById() no tenemos certeza de cuál será el tipo del objeto que recuperaremos; esto se debe a que podríamos recuperar un objeto de tipo canvas, un párrafo, una imagen, etc. Para “solucionar” esto, TypeScript opta por usar un tipo genérico HtmlElement, el cual no nos es útil en muchas ocasiones.
Uso de la aserción de tipos en TypeScript
Es entonces que interviene la aserción de tipos, lo cual nos permite indicarle a TypeScript cuál debería ser el tipo de una variable de la cual TypeScript no puede hacer una correcta inferencia. En nuestro ejemplo, podríamos hacer lo siguiente:
const canvas = document.getElementById('canvas') as HTMLCanvasElement;
Lenguaje del código: JavaScript (javascript)
De este modo le estamos indicando a TypeScript que nuestra constante canvas debe ser tratada como un objeto de tipo HTMLCanvasElement.
Precaución con las aserciones de tipo
Debemos tener cuidado con las aserciones de tipo, ya que como mencionamos anteriormente, estas deben usarse cuando el tipo de un objeto no puede deducirse antes de la ejecución del código. Esto se torna peligroso porque podríamos “imponer” a TypeScript un tipo diferente al que se recupera en tiempo de ejecución. Por ejemplo:
const canvas = document.getElementById('parrafo') as HTMLCanvasElement;
Lenguaje del código: JavaScript (javascript)
En este código tenemos un error, ya que no estamos recuperando un canvas, estamos recuperando un párrafo (lo estamos indicando en el id). De este modo, estamos recuperando algo distinto a lo esperado y por tanto el “as HTMLCanvasElement” le está imponiendo un tipo incorrecto a nuestro objeto.
Uso del operador instanceof para validación
Para solucionar esto podemos hacer una validación simple usando instanceof. El operador instanceof nos permite validar que un objeto provenga de una clase específica. En nuestro ejemplo podemos hacer lo siguiente:
const canvas = document.getElementById('canvas');
if (canvas instanceof HTMLCanvasElement) {
// Aquí estamos seguros de que 'canvas' es un HTMLCanvasElement
const ctx = canvas.getContext('2d');
}
Lenguaje del código: JavaScript (javascript)
De este modo, solo haremos la aserción si estamos seguros de que el objeto recuperado es el correcto.
Conclusión
En resumen, la aserción de tipos en TypeScript es una herramienta poderosa que nos permite trabajar con tipos específicos cuando la inferencia de tipos no es posible. Sin embargo, debemos usarla con precaución para evitar errores en tiempo de ejecución. Validar los tipos con instanceof puede ayudarnos a asegurarnos de que estamos trabajando con el tipo correcto de objeto.