Ошибки, которые вас спасают
На курсе JavaScript некоторые ошибки не вызывали никакого сообщения. Программа запускалась и давала странный результат или падала лишь тогда, когда добиралась до ошибки. В этой программе три такие ошибки:
const hero = { name: "Кира", health: 50 };
const maxHealth = 50;
hero.health = hero.helth - 10;
console.log("Здоровье:", hero.health);
console.log(hero.name.toUppercase());
maxHealth = 60;Как JavaScript она вывела бы Здоровье: NaN, а затем упала бы с ошибкой TypeError: hero.name.toUppercase is not a function. Третья ошибка ждала бы, пока вы исправите вторую. TypeScript находит все три до запуска программы:
main.ts(4,20): error TS2551: Property 'helth' does not exist on type '{ name: string; health: number; }'. Did you mean 'health'?
main.ts(6,23): error TS2551: Property 'toUppercase' does not exist on type 'string'. Did you mean 'toUpperCase'?
main.ts(7,1): error TS2588: Cannot assign to 'maxHealth' because it is a constant.- Опечатка в названии свойства. В JavaScript несуществующее свойство даёт
undefined, а вычисление сundefinedдаётNaN. TypeScript знает, какие свойства есть у объекта, по тому объекту, который вы создали. Он ловит опечатку даже при присваивании: в JavaScripthero.Health = 60;молча добавило бы новое свойствоHealth, а TypeScript сообщаетProperty 'Health' does not exist on type …и предлагаетhealth. - Неправильно написанный метод. Заглавные и строчные буквы различаются, поэтому
toUppercase— это неtoUpperCase. TypeScript знает все методы строк и подсказывает нужный. - Присваивание константе. В JavaScript это была ошибка
TypeError: Assignment to constant variable., но лишь во время работы программы. TypeScript сообщает о ней заранее:Cannot assign to 'maxHealth' because it is a constant.Если значение должно меняться, создавайте переменную черезlet. Если нет — не присваивайте ей.
Помните, что const защищает переменную, а не объект, лежащий в ней. Выше hero.health = … допустимо, хотя hero — константа: константа всё время хранит один и тот же объект, меняется лишь свойство объекта. Так работает JavaScript, и TypeScript ему следует.
Все эти ошибки легко сделать и трудно найти в большой программе, потому что JavaScript показывает их последствия не там, где они находятся. TypeScript указывает на точную строку. Это главная причина, по которой программисты им пользуются: многие баги просто не успевают запуститься.
Задание
- 1
В редакторе Кира сражается с волком. В программе четыре ошибки, и как JavaScript она упала бы уже на строке 6. Исправьте их все, чтобы программа вывела:
КИРА vs ВОЛК Раунд 1, здоровье Киры: 42 Раунд 2, здоровье Киры: 34 - 2
Волк не сдаётся. В конце программы добавьте третий раунд: увеличьте
roundна 1 иattackволка на 2 (волк злится), затем уменьшите здоровье Киры на атаку волка и выведите такую же строку, как после других раундов.wolf— константа, но вы меняете только её свойство, так что TypeScript это разрешает. Тогда программа выведет:КИРА vs ВОЛК Раунд 1, здоровье Киры: 42 Раунд 2, здоровье Киры: 34 Раунд 3, здоровье Киры: 24