Вывод типов
В предыдущих упражнениях вы ни разу не говорили TypeScript, что potions хранит число или что у героя есть свойство health. TypeScript определил это сам по значениям. Это называется выводом типов (type inference): TypeScript выводит (вычисляет) тип каждой переменной из значения, которое вы ей дали.
Для простых значений в TypeScript есть три основных типа. Их названия совпадают с теми, что даёт typeof в JavaScript:
string— строка, например"Кира"или"".number— любое число, целое или дробное, например120,-5или2.5. В TypeScript один тип для всех чисел.boolean—trueилиfalse.
let heroName = "Кира"; // string
let gold = 120; // number
let hasMap = false; // booleanTypeScript выводит и типы объектов и массивов. Для { name: "Кира", health: 50 } тип — { name: string; health: number; }, как вы видели в сообщении об ошибке в предыдущем упражнении. О таких типах вы узнаете больше в следующих уроках.
Тип определяет, что можно делать со значением. У строки есть длина, её можно перевести в верхний регистр; у числа нет ни того, ни другого:
let heroName = "Кира";
let gold = 120;
console.log(heroName.toUpperCase());
console.log(gold.toUpperCase());main.ts(5,18): error TS2339: Property 'toUpperCase' does not exist on type 'number'.toUpperCase() — метод строк, поэтому TypeScript разрешает его для heroName, которая имеет тип string. Для gold, имеющей тип number, он сообщает, что у типа number нет такого свойства. (Метод — это свойство, значение которого функция, поэтому в сообщении сказано «свойство».) Как программа на JavaScript она вывела бы КИРА, а потом упала бы с ошибкой TypeError: gold.toUpperCase is not a function, но лишь тогда, когда дошла бы до этой строки. Если бы строка была внутри if, который срабатывает лишь изредка, баг мог бы прятаться неделями. TypeScript проверяет каждую строку, в том числе и те, что в этот раз не выполняются.
Ещё одно, что вы можете заметить: для const gold = 120; в сообщении был бы назван тип '120', а не 'number'. Это тоже число, только точное, потому что константа никогда не меняется. Подробнее вы узнаете в следующем уроке.
Типичные ошибки:
- Метод строк, применённый к числу, как выше, часто из-за того, что перепутали две переменные.
- Длина числа:
gold.lengthдаётProperty 'length' does not exist on type 'number'.Длина есть у строк и массивов, у чисел её нет.
Задание
- 1
Карточка персонажа в редакторе должна выводить класс Киры заглавными буквами, но одна переменная перепутана. Запустите программу, найдите ошибку по сообщению и исправьте её, чтобы программа вывела:
Имя: КИРА Класс: СЛЕДОПЫТ Золото: 120 - 2
В конце программы выведите типы трёх переменных с помощью
typeofиз JavaScript в порядкеheroName,heroClass,gold. Это те же типы, которые вывел TypeScript. Тогда программа выведет ещё и:Типы: string string number