Правильное число аргументов
В JavaScript функцию можно вызвать с меньшим числом аргументов, чем у неё параметров, или с большим. Параметр без аргумента равен undefined, а лишние аргументы молча отбрасываются:
function damage(power, armor) {
return power - armor;
}
console.log(damage(12));
console.log(damage(20, 5, 3));В JavaScript это выведет:
NaN
15NaN («не число») получается, когда вы вычисляете с undefined: 12 - undefined. Во втором вызове 3, возможно, задумывалась как бонус, но у damage нет для неё параметра, поэтому она пропала без единого слова.
TypeScript проверяет число аргументов в каждом вызове. Добавим типы:
function damage(power: number, armor: number): number {
return power - armor;
}
console.log(damage(12));
console.log(damage(20, 5, 3));main.ts(5,13): error TS2554: Expected 2 arguments, but got 1.
main.ts(6,27): error TS2554: Expected 2 arguments, but got 3.Expected 2 arguments, but got 1 («ожидалось 2 аргумента, а получен 1»): у функции два параметра, поэтому она ждёт два аргумента, а в вызове передан только один. Когда аргумента не хватает, столбец указывает на имя функции. Когда один лишний, он указывает на первый лишний аргумент.
Увидев эту ошибку, посмотрите на первую строку функции: что ей нужно и в каком порядке? Иногда неверен вызов, и вы исправляете вызов. Иногда функции действительно нужно ещё одно значение, и вы добавляете параметр. Тогда TypeScript делает очень полезную вещь: показывает каждый вызов в программе, который нужно изменить. В большой программе таких мест могут быть десятки, и вам пришлось бы искать их самим, а в JavaScript те, что вы пропустили бы, молча вычисляли бы с undefined.
Бывают и параметры, которые можно не передавать. Им посвящены следующие два упражнения.
Задание
- 1
Исправьте оба вызова. Кира бьёт гоблина с уроном 8. В вызове Бруно на один аргумент больше, чем нужно: уберите
3. Программа выведет:Кира бьёт монстра «гоблин»: урон 8 Бруно бьёт монстра «волк»: урон 12 - 2
Теперь у монстров есть броня, которая уменьшает урон. Добавьте в
attackчетвёртый параметрarmorтипаnumber. TypeScript сообщит об обоих вызовах, потому что в каждом теперь не хватает аргумента. Добавьте в них броню: у гоблина она 2, у волка 5. - 3
Теперь используйте броню: в возвращаемой строке напишите
${damage - armor}вместо${damage}. Программа выведет:Кира бьёт монстра «гоблин»: урон 6 Бруно бьёт монстра «волк»: урон 7