Historia de la pregunta
En JavaScript, el operador typeof se utiliza para verificar el tipo de valores primitivos en tiempo de ejecución. TypeScript amplía este mecanismo y lo convierte en parte del sistema de reducción de tipos (type narrowing) a través de las guardas de tipo (type guards). TypeScript utiliza el resultado del operador typeof para especificar el tipo de una variable dentro de un bloque de código, lo que permite describir de manera más precisa la lógica de la función, especialmente al trabajar con tipos union.
Problema
En JavaScript, después de verificar el tipo de un valor usando typeof, no hay ninguna garantía de tipo: el programador debe recordar qué sucede en cada parte del código. Sin embargo, en TypeScript, la tarea se complica por la presencia de diferentes tipos y tipos union, y sin una adecuada reducción de tipo, es fácil cometer un error, por ejemplo, llamando a un método inexistente. Además, el operador tiene limitaciones concretas: solo "ve" tipos primitivos básicos, por ejemplo, para arrays y objetos retornará 'object'.
Solución
TypeScript permite combinar el operador typeof con análisis de tipos para reducir el tipo de la variable dentro de un bloque de código. Esto aumenta automáticamente la seguridad, ya que el compilador sabe con qué tipo trabaja el código y sugiere las posibles propiedades y métodos.
Ejemplo de código:
function printId(id: number | string) { if (typeof id === 'string') { // En esta rama id: string console.log(id.toUpperCase()); } else { // En esta rama id: number console.log(id.toFixed(2)); } }
Características clave:
¿Puede el operador typeof identificar un array?
No, typeof para un array y un objeto devolverá el mismo valor — 'object'. Para identificar arrays es mejor usar el método Array.isArray().
Ejemplo de código:
const arr = [1, 2, 3]; console.log(typeof arr); // 'object' console.log(Array.isArray(arr)); // true
¿Se puede diferenciar null y objeto con typeof?
No, typeof null devuelve 'object'; esta es una peculiaridad histórica de JavaScript.
Ejemplo de código:
console.log(typeof null); // 'object'
¿Se puede verificar una clase personalizada con typeof?
No, para las instancias de clases, typeof también devolverá 'object'. Para esto se utilizan el operador instanceof o funciones de guardas de tipo personalizadas.
Ejemplo de código:
class User {} const u = new User(); console.log(typeof u); // 'object' console.log(u instanceof User); // true
typeof para verificar estructuras de datos complejas (por ejemplo, arrays, null, objetos).instanceof y Array.isArray() para una reducción de tipo más precisa.Un programador escribió una función que quería verificar si un value era un array usando typeof, y basado en el resultado, llamar a diferentes métodos.
Pros:
Contras:
Uso de Array.isArray y combinación con guardas de tipo.
Pros:
Contras: