В этом руководстве вы узнаете о параметрах в TypeScript.
Параметры TypeScript по умолчанию
JavaScript поддерживает параметры по умолчанию, начиная с ES2015(или ES6) со следующим синтаксисом:
function name(parameter1=defaultValue1,...) { // do something }
В этом синтаксисе, если вы не передаете аргументы или не передаете undefined
в функцию при ее вызове, функция примет инициализированные значения по умолчанию для пропущенных параметров. Например:
function applyDiscount(price, discount = 0.05) { return price *(1 - discount); } console.log(applyDiscount(100)); // 95
В этом примере функция applyDiscount()
имеет параметр скидки в качестве параметра по умолчанию.
Если вы не передаете аргумент discount
в функцию applyDiscount()
, функция использует значение по умолчанию, которое равно 0.05
.
Подобно JavaScript, вы можете использовать параметры по умолчанию в TypeScript с тем же синтаксисом:
function name(parameter1:type=defaultvalue1, parameter2:type=defaultvalue2,...) { // }
В следующем примере используются параметры по умолчанию для функции applyDiscount()
:
function applyDiscount(price: number, discount: number = 0.05): number { return price *(1 - discount); } console.log(applyDiscount(100)); // 95
Обратите внимание, что вы не можете включать параметры по умолчанию в определения типов функций. Следующий код приведет к ошибке:
let promotion:(price: number, discount: number = 0.05) => number;
Ошибка:
error TS2371: A parameter initializer is only allowed in a function or constructor implementation.
Параметры по умолчанию и дополнительные параметры
Как и дополнительные параметры, параметры по умолчанию также являются необязательными. Это означает, что вы можете опустить параметры по умолчанию при вызове функции.
Кроме того, параметры по умолчанию и конечные параметры по умолчанию имеют один и тот же тип. Например, следующая функция:
function applyDiscount(price: number, discount: number = 0.05): number { // ... }
и
function applyDiscount(price: number, discount?: number): number { // ... }
поделиться одним и тем же типом:
(price: number, discount?: number) => number
Необязательные параметры должны идти после обязательных параметров. Однако параметры по умолчанию не обязательно должны стоять после обязательных параметров.
Когда параметр по умолчанию появляется перед обязательным параметром, вам нужно явно передать undefined
, чтобы получить инициализированное значение по умолчанию.
Следующая функция возвращает количество дней в указанном месяце и году:
function getDay(year: number = new Date().getFullYear(), month: number): number { let day = 0; switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: day = 31; break; case 4: case 6: case 9: case 11: day = 30; break; case 2: // leap year if (((year % 4 == 0) && !(year % 100 == 0)) || (year % 400 == 0)) day = 29; else day = 28; break; default: throw Error('Invalid month'); } return day; }
В этом примере значением года по умолчанию является текущий год, если вы не передаете аргумент или передаете неопределенное значение.
В следующем примере функция getDay()
используется для получения количества дней в феврале 2019 года:
let day = getDay(2019, 2); console.log(day); // 28
Чтобы получить количество дней в феврале текущего года, вам нужно передать undefined в параметр года следующим образом:
let day = getDay(undefined, 2); console.log(day);
Необязательные параметры
В JavaScript вы можете вызывать функцию без передачи каких-либо аргументов, даже если функция указывает параметры. Поэтому JavaScript по умолчанию поддерживает необязательные параметры.
В TypeScript компилятор проверяет каждый вызов функции и выдает ошибку в следующих случаях:
- Количество аргументов отличается от количества параметров, указанных в функции.
- Или типы аргументов несовместимы с типами параметров функции.
Поскольку компилятор тщательно проверяет передаваемые аргументы, вам необходимо аннотировать необязательные параметры, чтобы компилятор не выдавал ошибку, когда вы пропускаете аргументы.
Чтобы сделать параметр функции необязательным, используйте ?
после имени параметра. Например:
function multiply(a: number, b: number, c?: number): number { if(typeof c !== 'undefined') { return a * b * c; } return a * b; }
Как это устроено:
- Во-первых, используйте
?
после параметраc
. - Во-вторых, проверьте, передается ли аргумент функции, используя выражение
typeof c !== 'undefined'
.
Обратите внимание, что если вы используете выражение if(c)
для проверки того, не инициализирован ли аргумент, вы обнаружите, что пустая строка или ноль будут рассматриваться как undefined
.
Необязательные параметры должны стоять после обязательных параметров в списке параметров.
Например, если вы сделаете параметр b
необязательным, а параметр c
обязательным, компилятор TypeScript выдаст ошибку:
function multiply(a: number, b?: number, c: number): number { if(typeof c !== 'undefined') { return a * b * c; } return a * b; }
Ошибка:
error TS1016: A required parameter cannot follow an optional parameter.
Остальные параметры TypeScript
В этом разделе вы узнаете об остальных параметрах TypeScript, которые позволяют вам представлять неопределенное количество аргументов в виде массива.
Параметр rest позволяет функции принимать ноль или более аргументов указанного типа. В TypeScript остальные параметры следуют следующим правилам:
- Функция имеет только один остаточный параметр.
- Остальные параметры отображаются последними в списке параметров.
- Тип параметра rest является типом массива.
Чтобы объявить остаточный параметр, вы добавляете к имени параметра префикс из трех точек и используете тип массива в качестве аннотации типа:
function fn(...rest: type[]) { //... }
В следующем примере показано, как использовать оставшийся параметр:
function getTotal(...numbers: number[]): number { let total = 0; numbers.forEach((num) => total += num); return total; }
В этом примере getTotal()
вычисляет общее количество переданных в него чисел.
Поскольку параметр чисел является оставшимся параметром, вы можете передать одно или несколько чисел для расчета суммы:
console.log(getTotal()); // 0 console.log(getTotal(10, 20)); // 30 console.log(getTotal(10, 20, 30)); // 60
Заключение
- Используйте синтаксис параметра по умолчанию
parameter:=defaultValue
, если вы хотите установить для параметра инициализированное значение по умолчанию. - Параметры по умолчанию являются необязательными.
- Чтобы использовать инициализированное значение параметра по умолчанию, вы опускаете аргумент при вызове функции или передаете
undefined
в функцию. - Используйте синтаксис
parameter?: type
, чтобы сделать параметр необязательным. - Используйте выражение
typeof(parameter) !== 'undefined'
, чтобы проверить, был ли параметр инициализирован. - Остальные параметры TypeScript позволяют вам представлять неопределенное количество аргументов в виде массива.