Типы параметров
В курсе JavaScript вы писали функции вроде этой. Она прибавляет к здоровью героя то, что восстанавливает зелье:
function heal(health, amount) {
return health + amount;
}
console.log(heal(30, 20));
console.log(heal(45, "5"));В JavaScript она выведет 50, а затем 455. Во втором вызове передана строка "5", а + со строкой не складывает, а склеивает. У героя вдруг 455 здоровья, и никто этого не замечает до поры до времени.
В TypeScript эта программа вообще не запустится. Компилятор сообщает:
main.ts(1,15): error TS7006: Parameter 'health' implicitly has an 'any' type.
main.ts(1,23): error TS7006: Parameter 'amount' implicitly has an 'any' type.TypeScript умеет определять тип переменной по её значению, но у параметра в самой функции значения нет. Оно появляется только при вызове функции, и каждый вызов может передать что-то своё. Поэтому TypeScript не знает, что такое health, и ему пришлось бы дать этому параметру тип any, который отключает проверку, как вы знаете из прошлого урока. Об этом и говорит сообщение: у параметра неявно (без вашего указания) тип any. TypeScript этого не допускает и просит вас записать тип самостоятельно.
Тип параметра записывается так же, как тип переменной: после имени ставятся двоеточие и тип:
function heal(health: number, amount: number) {
return health + amount;
}
console.log(heal(30, 20));
console.log(heal(45, "5"));main.ts(6,22): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.Теперь TypeScript знает, что нужно функции, и проверяет каждый вызов. Это сообщение вам знакомо по упражнению о массивах из прошлого урока, где в push попало не то значение: push — тоже функция, у параметра которой есть тип. Столбец 22 указывает прямо на аргумент "5". Это string, а параметр amount — number. Замените его на 5, и программа дважды выведет 50.
Типы помогают и внутри функции. TypeScript знает, что health — число, поэтому health.toUpperCase() в теле функции было бы ошибкой, как и в случае с переменной.
Типичные ошибки:
- Тип указан только у части параметров. В
function heal(health, amount: number)уhealthпо-прежнему нет типа, и для него вы получите TS7006. Каждому параметру нужен свой тип, даже если у всех он одинаковый. =вместо двоеточия.function heal(health = number, amount = number)даёт'number' only refers to a type, but is being used as a value here.После=идёт значение по умолчанию, как вы знаете из курса JavaScript, аnumber— это тип, а не значение.
Задание
- 1
Укажите у обоих параметров
healтипnumber. Запустите программу: TypeScript теперь найдёт ошибку в последней строке. Исправьте её: зелье восстанавливает 5 единиц здоровья, поэтому передайте число5вместо строки"5". - 2
Под
healнапишите функциюdescribeHeroс двумя параметрами:nameтипаstringиlevelтипаnumber. Она возвращает строку видаКира, уровень 3. - 3
В конце программы выведите
describeHero("Кира", 3). Программа выведет:50 50 Кира, уровень 3