Historia del tema:
TypeScript implementa tipado estático, por lo que a veces es necesario convertir explícitamente un tipo en otro. Por ejemplo, cuando el desarrollador conoce mejor la estructura de datos que el compilador o cuando necesita trabajar con una API tipada cuyos tipos de origen no coinciden con los esperados. Para esto se utiliza el mecanismo de type casting o aserciones de tipo.
Problema:
La conversión de tipos (type casting) en TypeScript no realiza ninguna transformación de los valores a nivel de ejecución: solo le dice al compilador "confía en mí". Esto puede generar errores si el casting indicado no corresponde al contenido real de los datos. Los errores aparecerán solo en tiempo de ejecución y el compilador no podrá detectarlos.
Solución:
TypeScript incluye dos sintaxis para la conversión de tipos: la sintaxis de corchetes angulares (obsoleta, no recomendada para JSX) y la sintaxis as (recomendada).
Ejemplo de código:
// Sintaxis con corchetes angulares (no para .tsx) let someValue: any = "Hello World"; let strLength: number = (<string>someValue).length; // Sintaxis con as let strLength2: number = (someValue as string).length; // Conversión de tipo de objeto (¡inseguro!) interface Cat { meow(): void; } interface Dog { bark(): void; } let dog: Dog = { bark() {} }; let cat = dog as unknown as Cat; // se puede, ¡pero esto elude la tipificación!
Características clave:
¿Realiza la aserción de tipo conversión automática de valores en tiempo de ejecución, como en C# o Java?
No, la aserción de tipo solo indica al compilador que la variable es de ese tipo. No ocurre ninguna transformación de valores: la responsabilidad recae completamente en el desarrollador.
¿Se puede convertir un tipo A a un tipo B sin una estructura común?
TypeScript lo permitirá (a través de un doble cast, como any o unknown), pero esto socava la seguridad de tipos y puede conducir a errores en tiempo de ejecución.
const a = 5 as unknown as string; // ¡no es seguro!
¿Es seguro convertir any a un tipo complejo?
No, any desactiva la verificación de tipos: convertir any a otro tipo es posible, pero TypeScript no podrá detectar discrepancias, cualquier error se manifestará solo en la ejecución.
Un desarrollador recibe un objeto del servidor sin verificar su estructura, lo convierte al tipo esperado de manera simple as SomeType y lo utiliza en la lógica de negocio. Al cambiar la API o en caso de un bug en el servidor, la aplicación falla en tiempo de ejecución, sin errores en el momento de la compilación.
Pros:
Contras:
Un desarrollador valida previamente la estructura del objeto recibido, utiliza una función de guardia de tipo personalizada y solo después de una validación exitosa se realiza la aserción de tipo.
Pros:
Contras: