Типы исчезают
Когда вы нажимаете «Запустить», на самом деле запускается не TypeScript, а JavaScript. Компилятор сначала проверяет типы, потом убирает их, и запускается оставшийся JavaScript. Посмотрите на эту программу. : string и : number после имён переменных — это типы, записанные вручную, они называются аннотациями типов. Сами вы начнёте их писать со следующего урока.
let heroName: string = "Кира";
let arrows: number = 20;
console.log(heroName + ", стрел: " + arrows);Компилятор превращает её в такой JavaScript:
let heroName = "Кира";
let arrows = 20;
console.log(heroName + ", стрел: " + arrows);Обе программы выводят:
Кира, стрел: 20Типы нужны только для проверки. Когда программа запускается, их уже нет, и она делает ровно то же, что сделал бы такой же JavaScript. TypeScript не меняет того, как работает ваш код, поэтому всё, что вы знаете о JavaScript, остаётся в силе, включая его сюрпризы:
console.log("5" + 3);
console.log(0.1 + 0.2);Вывод:
53
0.30000000000000004Почему TypeScript не считает "5" + 3 ошибкой? Потому что соединять строку и число через + допустимо и очень часто встречается в JavaScript: так составляют сообщения вроде "Золото: " + gold. TypeScript сообщает о том, что почти наверняка является ошибкой, но не запрещает обычный JavaScript. А 0.30000000000000004 — это крошечная неточность дробных чисел, знакомая вам по курсу JavaScript. Изменить её TypeScript тоже не может.
Зато TypeScript знает, что "5" + 3 даёт строку. Поэтому, когда вы пытаетесь положить такую строку в переменную для чисел, он сообщает об ошибке:
let arrows = 20;
arrows = arrows + "5";main.ts(2,1): error TS2322: Type 'string' is not assignable to type 'number'.Здесь тип защищает вас даже от +. Но когда переменная с самого начала хранит строку, строка плюс число снова даёт строку, всё сходится, и TypeScript нечего сообщать. Программа тогда соединяет вместо того, чтобы складывать, как это сделал бы JavaScript. В программе в редакторе два таких бага.
Задание
- 1
Запустите программу. Она выводит
Стрел: 205, а TypeScript не сообщил ни об одной ошибке:arrowsхранит строку"20", а строка плюс число — это строка. Замените первое значениеarrowsна число, чтобы программа вывела:Стрел: 25 - 2
Второй баг: после награды у Киры
12030золота. Исправьте его так же, чтобы программа вывела:Стрел: 25 Золото: 150