Ваша первая ошибка типов
В JavaScript переменная может хранить что угодно, и то, что в ней лежит, в любой момент может смениться с числа на строку:
let lives = 3;
console.log("Жизни:", lives);
lives = "три";
console.log("Жизни:", lives);На курсе JavaScript эта программа вывела бы Жизни: 3 и Жизни: три, и ничто не казалось бы неправильным. Неприятности начались бы позже: как только игра начала бы считать с этими жизнями, например lives - 1, получилось бы NaN.
TypeScript не запускает эту программу. Вместо этого он показывает ошибку:
main.ts(3,1): error TS2322: Type 'string' is not assignable to type 'number'.Что случилось? В строке 1 переменная lives получила значение 3 — число. Отсюда TypeScript решил, что lives хранит числа: её тип — number. С этого момента он проверяет каждое значение, которое программа кладёт в lives. В строке 3 программа пытается положить туда "три", а это строка. В TypeScript тип строк называется string — так же, как его называет typeof в JavaScript. Сообщение говорит именно об этом: значение типа string нельзя присвоить (not assignable) типу number, то есть положить в переменную, которая хранит числа. Цифра 3 в main.ts(3,1) — номер строки с ошибкой. Все части сообщения вы разберёте в следующем упражнении.
Обратите внимание: программа ничего не вывела, даже Жизни: 3 из строки 2, хотя с этой строкой всё в порядке. TypeScript проверяет всю программу до запуска, и если находит хоть одну ошибку типов, не запускается ничего. В JavaScript большинство ошибок проявлялись, только когда программа до них добиралась, а то, что она успела вывести, оставалось на экране. TypeScript не запускает программу, пока не исправлены все ошибки типов.
Это может показаться строгостью, но именно в этом польза TypeScript. Об ошибке сообщается сразу и на той строке, где она находится, а не странным NaN где-то потом и не неверным результатом, который никто не замечает.
Переменная сохраняет свой тип на всю программу, но её значение может меняться, если новое значение того же типа: lives = 2; допустимо. Но осторожнее с кавычками: lives = "2"; — тоже ошибка, потому что "2" в кавычках — это строка, а не число.
Задание
- 1
Программа в редакторе считает золото и зелья Киры в лавке, но TypeScript отказывается её запускать. Нажмите «Запустить» и прочитайте сообщение об ошибке. Затем исправьте строку с ошибкой: Кира купила ещё одно зелье, так что их теперь 3, а
potionsдолжна остаться числом. Тогда программа выведет:Золото: 120 Зелий: 2 Золото: 90 Зелий: 3 - 2
Перед следующим боем Кира выпивает одно зелье. В конце программы уменьшите
potionsна 1 с помощьюpotions = potions - 1;и выведите ту же строку ещё раз, чтобы программа вывела:Золото: 120 Зелий: 2 Золото: 90 Зелий: 3 Золото: 90 Зелий: 2