Sobre los tipos any y unknown
Tipo any
any es un tipo que lo recibe todo y satisface todo:
let price: any;
price = 10.5;
price = "10.5";
price = { whole: 10, fraction: 50 };
price = [10, 50];
price = false;
price = "Esto podría ser cualquier cosa";
Los valores e tipo any satisfacen cualquier otro tipo:
let price: any;
function calculateTotalPrice(basePrice: number, taxes: number) {
return basePrice + taxes;
}
calculateTotalPrice(price, 21);
Como price es any, puede pasarse como un argumento que espera un tipo number.
El efecto adverso de any es que si por cómo se ejecuta el código price acaba siendo un objeto, TypeScript no
detectará el error cuando ese objeto se pase a un argumento de tipo number, y solo lo veremos durante tiempo de
ejecución.
Yo intento no utilizar nunca any. A veces lo utilizo de manera dispersa en tests, por ejemplo para crear mocks donde
la alternativa es demasiado verbosa para un contexto tan escueto. Pero siempre intento encontrarle una alternativa. Y si
no lo hago, pruebo con unknown.
Tipo unknown
unknown es un tipo que lo recibe todo pero que satisface nada:
let price: unknown;
price = 10.5;
price = "10.5";
price = { whole: 10, fraction: 50 };
price = [10, 50];
price = false;
price = "Esto podría ser cualquier cosa";
Una variable de tipo unknown tiene el mismo comportamiento que una any a la hora de asignarle valores, pero difiero
al hora de utilizarla:
let price: unknown;
function calculateTotalPrice(basePrice: number, taxes: number) {
return basePrice + taxes;
}
calculateTotalPrice(price, 21);
// ^ Argumento de tipo unknown no es asignable a number
Cuando usamos una variable de tipo unknown , TypeScript nos fuerza a determinar su tipo, con estrechamiento de tipos o
conversión, antes de utilizarla:
let price: unknown;
function calculateTotalPrice(basePrice: number, taxes: number) {
return basePrice + taxes;
}
if (typeof price === "number") {
calculateTotalPrice(price, 21);
}