En TypeScript, los tipos any, unknown y object se utilizan en diferentes escenarios y tienen diferencias clave:
any: desactiva el sistema de tipos para la variable. Permite hacer cualquier cosa con la variable sin causar errores de compilación. Úsalo cuando el tipo del objeto no se conoce de antemano y la seguridad no es crítica.unknown: también acepta cualquier tipo, pero se requiere una verificación/cast explícita para trabajar con estas variables. Es más seguro que any. Úsalo para valores de tipo desconocido, para no perder el control sobre la tipificación.object: tipo solo para objetos no primitivos (objetos, arreglos, funciones), pero no para primitivos (números, cadenas). Limita el trabajo solo a objetos.let a: any = 1; a = 'cadena'; // OK a(); // OK (pero puede causar un error en tiempo de ejecución) let b: unknown = 'hola'; b = 5; // OK // b.toUpperCase(); // Error — se requiere verificación de tipo if (typeof b === 'string') { console.log(b.toUpperCase()); } let c: object = { key: 'value' }; c = [1, 2, 3]; // OK // c = 1; // Error, ya que '1' no es un objeto
Pregunta: ¿Qué beneficio aporta el tipo unknown, si podemos usar any?
Respuesta: unknown aumenta la seguridad del código: no podrás realizar acciones no verificadas con la variable como con any. Necesitas verificar o hacer un cast explícito, lo que elimina muchas sorpresas en tiempo de ejecución.
function handle(value: unknown) { // value.trim(); // Error if (typeof value === 'string') { value.trim(); } }
Historia
En el proyecto decidieron integrar rápidamente una biblioteca de terceros, describiendo su resultado como any, para no preocuparse por los tipos. Como resultado, en tiempo de ejecución se descubrió que la biblioteca devolvía no un arreglo sino un objeto con campos, lo que causaba errores masivos en el método .map() — este código compilaba, pero fallaba al ejecutarse.
Historia
Uno de los desarrolladores usó unknown para los datos recibidos del backend, pero no agregó verificación de tipo antes de trabajar con los campos. Como resultado, TypeScript no compiló el código — y tuvo que cambiar rápidamente a any, lo que ocultó posibles errores de análisis y llevó a errores en producción debido a un formato de datos incorrecto.
Historia
Al trabajar con el tipo object, hubo confusión: intentaban asignar a una variable de tipo object valores string y number. Aunque en la etapa de desarrollo no notaron el problema, durante la revisión se identificaron errores relacionados con el hecho de que los métodos de objeto no funcionaban con primitivos. Se necesitó tiempo adicional para solucionarlo.