Функции, которые ничего не возвращают
Некоторые функции ничего не возвращают. Они просто что-то делают, например выводят строку. Их возвращаемый тип называется void («пустота»):
function printHero(name: string, health: number): void {
console.log(`${name}: здоровье ${health}`);
}
printHero("Кира", 50);
printHero("Бруно", 65);Это выведет:
Кира: здоровье 50
Бруно: здоровье 65: void говорит: эта функция не возвращает значения, её вызывают ради того, что она делает. Если его не писать, TypeScript сам определит void, но когда вы его пишете, ваше намерение понятно, и TypeScript сообщит о return со значением, который попал туда по ошибке:
function printHero(name: string, health: number): void {
console.log(`${name}: здоровье ${health}`);
return health;
}main.ts(3,5): error TS2322: Type 'number' is not assignable to type 'void'.Функция с void всё же может использовать return; без значения, чтобы закончиться раньше.
В JavaScript такая функция возвращает undefined, и ничто не мешает вам по ошибке использовать этот «результат». Чаще всего так бывает, когда функция выводит текст, который на самом деле нужен как значение. Разницу между выводом и возвратом вы знаете из курса JavaScript:
function heroTitle(name: string, level: number) {
console.log(`${name} из Вороньего Утёса, уровень ${level}`);
}
const title = heroTitle("Кира", 3);
console.log(title.toUpperCase());main.ts(6,19): error TS2339: Property 'toUpperCase' does not exist on type 'void'.В JavaScript эта программа вывела бы заголовок, а затем упала бы с ошибкой TypeError: Cannot read properties of undefined (reading 'toUpperCase'). TypeScript останавливает её до запуска: heroTitle возвращает void, поэтому в title нет ничего, что можно было бы использовать, и свойств у него нет. Исправить это можно так: пусть heroTitle не выводит строку, а возвращает её, с возвращаемым типом string. Тот, кто вызывает функцию, сможет вывести строку, сделать буквы заглавными или присоединить её к другой.
Другое использование результата void — тоже ошибка, например в условии:
function printHero(name: string, health: number): void {
console.log(`${name}: здоровье ${health}`);
}
if (printHero("Кира", 50)) {
console.log("Выведено!");
}main.ts(5,5): error TS1345: An expression of type 'void' cannot be tested for truthiness.console.log(printHero("Кира", 50)) проходит проверку, потому что console.log принимает что угодно. Он выведет строку, а затем undefined: это признак того, что вы выводите результат функции, которая ничего не возвращает.
Типичные ошибки:
returnсо значением в функции сvoid:Type 'number' is not assignable to type 'void'.Либо функция должна вернуть это значение (тогда измените её возвращаемый тип), либоreturnздесь не нужен.- Вывод внутри функции, результат которой нужен. Если коду, который вызывает функцию, нужно значение, функция должна его возвращать.
Задание
- 1
Функция
questNameвыводит свою строку, но программе эта строка нужна как значение. ИзменитеquestNameтак, чтобы она возвращала строку, а не выводила её. Тогда программа выведет:Задание: Волки в лесу (50 золота) ПОТЕРЯННАЯ КОРОНА [УРОВЕНЬ 3] - 2
Теперь запишите возвращаемые типы обеих функций:
voidдляprintQuestиstringдляquestName.