Значения по умолчанию
Часто у недостающего аргумента есть очевидное значение. Когда Кира атакует без особых приёмов, она бьёт с силой 10. С необязательным параметром вам пришлось бы самим проверять undefined. Значение по умолчанию короче, и оно вам знакомо по JavaScript:
function attack(monster: string, power: number = 10): string {
return `Кира бьёт монстра «${monster}» с силой ${power}`;
}
console.log(attack("гоблин"));
console.log(attack("тролль", 25));Это выведет:
Кира бьёт монстра «гоблин» с силой 10
Кира бьёт монстра «тролль» с силой 25Параметр со значением по умолчанию тоже необязателен: вызов может его не передавать. Но в отличие от power?: number, внутри функции он никогда не равен undefined. Если аргумента нет, power равен 10. Поэтому его тип внутри функции — просто number, и вычислять с ним можно без всяких проверок.
Тип можно и опустить. По power = 10 TypeScript понимает, что power — число, как и в случае с let power = 10;. В настоящем коде вы увидите обе формы. Вызовы проверяются в любом случае:
function attack(monster: string, power = 10): string {
return `Кира бьёт монстра «${monster}» с силой ${power}`;
}
console.log(attack("волк", "большой"));main.ts(5,28): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.И само значение по умолчанию должно подходить под тип: power: number = "10" даёт Type 'string' is not assignable to type 'number'.
Что выбрать? Значение по умолчанию — когда есть значение, которое подходит для большинства вызовов. Необязательный параметр с ? — когда отсутствие значения означает что-то другое, как с гостем без титула в предыдущем упражнении: его приветствуют другим текстом.
Типичные ошибки:
- Вопросительный знак и значение по умолчанию вместе:
power?: number = 10даётParameter cannot have question mark and initializer.Значение по умолчанию уже делает параметр необязательным, поэтому?не нужен. - Параметры со значениями по умолчанию стоят перед обязательными. С
function attack(power = 10, monster: string)вызовattack("гоблин")даётExpected 2 arguments, but got 1.Аргументы попадают в параметры по порядку, поэтому параметры со значениями по умолчанию ставьте в конец.
Задание
- 1
Большинство гостей пьют к еде воду. Задайте параметру
drinkзначение по умолчанию"вода". - 2
Большинство гостей берут и одну порцию. Задайте параметру
countзначение по умолчанию1. Затем в конце программы выведитеorder("Хлеб"). Программа выведет:1x Грибной суп, напиток: вода 2x Жареный кабан, напиток: сидр 1x Хлеб, напиток: вода