Veamos el siguiente ejemplo:
let a: string = "hello world" let b: number = 23 let c: any = 23 console.log(typeof a) // "string" console.log(typeof b) // "number" console.log(typeof c) // "number" a = b // Fails! a = c // Works! console.log(typeof a) // "number" a = b // Fails! a = "Hallo Welt" // Works! console.log(typeof a) // "string" ¿Por qué es posible cambiar el tipo de una variable que no es cualquiera? Esperaría x: any = y: string | number | ... , pero no x: string | number | ... = y: any , excepto si la variable any se infiere a un tipo coincidente.
¿Por qué puedo asignar una cadena después de "cambiar" el tipo a un número, pero no un número?
¿Cómo evito que una variable cambie su tipo?
Según la documentación de TypeScript :
No use
anycomo tipo a menos que esté en el proceso de migrar un proyecto de JavaScript a TypeScript. El compilador trata efectivamenteanycomo "por favor, desactive la verificación de tipos para esta cosa". Es similar a poner un comentario@ts-ignorealrededor de cada uso de la variable. Esto puede ser muy útil cuando está migrando por primera vez un proyecto de JavaScript a TypeScript, ya que puede establecer el tipo para las cosas que aún no ha migrado comoany, pero en un proyecto completo de TypeScript está deshabilitando la verificación de tipos para cualquier parte de su programa que úsaloEn los casos en los que no sabe qué tipo desea aceptar, o cuando desea aceptar algo porque lo pasará a ciegas sin interactuar con él, puede usar unknown .
let a: string = "hello world" let b: number = 23 let c: unknown = 23 console.log(typeof a) // "string" console.log(typeof b) // "number" console.log(typeof c) // "number" a = b // Fails! a = c // Fails! a = "Hallo Welt" //Works!