Переменные без значения
Переменная, созданная без значения, например let reward: number;, сначала значения не имеет: в JavaScript в ней лежит undefined. Значение кладут в неё позже, часто в ветках if. TypeScript прослеживает каждый путь по программе и проверяет, что везде, где вы используете переменную, значение у неё точно есть:
let monster = "goblin";
let reward: number;
if (monster === "wolf") {
reward = 50;
} else if (monster === "goblin") {
reward = 20;
}
console.log("Награда:", reward);main.ts(10,25): error TS2454: Variable 'reward' is used before being assigned.Сообщение говорит, что переменная используется до того, как ей присвоено значение. Но монстр — гоблин, так что reward получит 20, разве нет? На этот раз да. Но TypeScript не смотрит, что сейчас хранит monster. Он проверяет все пути, по которым может пойти программа. Если бы монстр был драконом, не выполнилась бы ни одна ветка, и программа вывела бы Награда: undefined. А вычисление вроде gold + reward тогда дало бы NaN.
Чтобы это исправить, позаботьтесь, чтобы каждый путь сохранял значение, чаще всего с помощью ветки else, которая выполняется во всех остальных случаях:
if (monster === "wolf") {
reward = 50;
} else if (monster === "goblin") {
reward = 20;
} else {
reward = 0;
}Другой способ — начальное значение: let reward = 0;. Тогда у переменной есть значение с самого начала, ветки лишь меняют его, и тип даже не нужен, потому что TypeScript выводит его из 0. Выбирайте то, что подходит: начальное значение, когда есть разумное, и переменную без значения, когда значение действительно приходит только из веток. Тогда TypeScript проверит, что вы не забыли ни одну из них.
Типичные ошибки:
ifилиelse ifбез завершающегоelse.- Ветка, которая делает что-то другое и забывает сохранить значение.
- Использование переменной, которая вообще не получает значения:
let reward: number;и затемconsole.log(reward);дают ту жеTS2454.
Задание
- 1
Запустите программу: TypeScript дважды сообщает об
TS2454. Веткаelse, для большой комнаты, забыла назначить цену. Большая комната стоит 25 золотых. Исправьте ветку, чтобы программа вывела:Лучшая комната во всём доме! Кира платит: 25. Осталось золота: 95 - 2
Бруно ещё и подаёт ужин, который тоже зависит от комнаты. Под
priceсоздайте переменнуюmealтипаstringбез значения. Затем сохраните в неё значение в каждой из трёх веток:"хлеб"для маленькой комнаты,"суп"для средней и"жареная курица"для большой. - 3
В конце программы выведите ужин, чтобы программа вывела ещё и:
Ужин: жареная курицаЕсли TypeScript сообщает
TS2454дляmeal, проверьте, что каждая ветка сохраняет в неё значение.