Константы и литеральные типы
Из предыдущего урока вы знаете, что константе нельзя присвоить значение повторно: TypeScript сообщает TS2588 до запуска программы. TypeScript использует это и при выводе типов. Сравните:
let level = 3; // number
const maxLevel = 10; // 10level создана через let, поэтому позже в ней может оказаться любое другое число, и её тип — number. maxLevel никогда не изменится, поэтому TypeScript даёт ей самый точный из возможных типов: 10. Такой тип, допускающий всего одно значение, называется литеральным типом (literal type). Со строками так же: тип у const heroName = "Кира"; — это "Кира".
Литеральный тип — это по-прежнему число или строка: maxLevel + 1 и heroName.length работают как обычно. Чаще всего литеральные типы вы будете замечать в сообщениях об ошибках:
const gold = 120;
console.log(gold.toUpperCase());main.ts(2,18): error TS2339: Property 'toUpperCase' does not exist on type '120'.Читайте type '120' как «число 120». Для строк литеральный тип стоит в двойных кавычках внутри одинарных кавычек сообщения: '"rain"' означает ровно строку rain:
const weather = "rain";
if (weather === "sun") {
console.log("Кира сушит плащ.");
}main.ts(2,5): error TS2367: This comparison appears to be unintentional because the types '"rain"' and '"sun"' have no overlap.weather — константа со значением "rain", поэтому она никогда не будет "sun", и условие никогда не выполнится. TypeScript на это указывает. В настоящей игре погода менялась бы, так что это был бы let, и сравнение было бы в порядке.
Литеральный тип можно написать и самому, как аннотацию. Тогда переменная может хранить только это единственное значение:
let difficulty: "hard" = "hard";
difficulty = "easy";main.ts(2,1): error TS2322: Type '"easy"' is not assignable to type '"hard"'.Тип с единственным значением сам по себе не очень полезен. В уроке «Объединения и сужение типов» вы будете объединять несколько таких типов: "easy" | "normal" | "hard" — это тип, допускающий ровно эти три строки, и тогда TypeScript ловит любую опечатку в них.
let или const? Как и на курсе JavaScript: используйте const для значений, которые не меняются (а таких большинство), и let только для тех, что меняются, например здоровья, золота или счётчика. Тогда TypeScript проверит это до запуска программы.
Задание
- 1
Кира встречает дракона, но TypeScript сообщает о двух ошибках. Здоровье Киры во время боя меняется: исправьте программу, чтобы она вывела:
Уголёк дышит огнём! Здоровье Киры: 35/50 Уголёк снова дышит огнём! Здоровье Киры: 20/50 - 2
Теперь посмотрите на остальные переменные:
dragonNameиfireDamageникогда не меняются, так что сделайте их константами.maxHealthостаётся константой.