any: отключение проверки
В TypeScript есть тип, из-за которого исчезают все ошибки: any. Переменная типа any может хранить что угодно, и TypeScript разрешает с ней всё: любое свойство, любой метод, любую операцию. Он просто перестаёт проверять:
let loot: any = "золотая корона";
console.log(loot.toUpperCase());
console.log(loot.toUppercase());TypeScript ничего не сообщает, и программа запускается. Она выводит ЗОЛОТАЯ КОРОНА, а затем падает на опечатке:
TypeError: loot.toUppercase is not a functionЭто именно то поведение JavaScript, от которого TypeScript должен вас защищать. С let loot: string = "золотая корона"; или просто let loot = "золотая корона"; TypeScript нашёл бы опечатку до запуска программы: Property 'toUppercase' does not exist on type 'string'. Did you mean 'toUpperCase'?
И any распространяется. Всё, что вы читаете из значения any, тоже имеет тип any, так что TypeScript не проверяет и это:
let loot: any = { name: "Золотая корона" };
const title = loot.nmae;
console.log(title.toUpperCase());И снова TypeScript не сообщает об ошибке, но когда программа запускается, title равно undefined, и она падает с ошибкой TypeError: Cannot read properties of undefined (reading 'toUpperCase').
Зачем же тогда нужен any? Он помогает, когда большая программа на JavaScript постепенно переходит на TypeScript, и вы ещё встретите его в старом коде. Его также соблазнительно написать, когда мешает сообщение об ошибке: сообщение исчезает, но ошибка остаётся и проявляется при запуске программы. Поэтому избегайте any. Если вы действительно не знаете, каким будет значение, у урока «Объединения и сужение типов» есть безопасная альтернатива: unknown.
Если TypeScript пришлось бы использовать any без вашего ведома, он сообщает об этом: сообщения со словами implicitly has … 'any', например про пустой массив в упражнении про массивы, значат, что он не может определить тип и вам нужно его написать.
Задание
- 1
Запустите программу: она падает с ошибкой
TypeError. Заменитеanyуtreasureнастоящим типом,string. Теперь TypeScript найдёт ошибку до запуска программы: исправьте её. Тогда программа выведетКира находит: ЗОЛОТАЯ КОРОНА, но золото Киры окажется странным:120300. - 2
Замените
anyуvalueнаnumber. Теперь TypeScript сообщит о следующей ошибке. Исправьте её, чтобы программа вывела:Кира находит: ЗОЛОТАЯ КОРОНА Золото: 420