Если необходимо, чтобы функция принимала набор однотипных параметров, то используется знак многоточия, после которого идет массив:
function addNumbers(firstNumber: number, ...numberArray: number[]): number { let result = firstNumber; for (let i = 0; i < numberArray.length; i++) { result+= numberArray[i]; } return result; } let num1 = addNumbers(3, 7, 8); console.log(num1); // 18 let num2 = addNumbers(3, 7, 8, 9, 4); console.log(num2); // 31
В данном случае функция addNumbers
фиксированно имеет только один параметр - firstNumber
, остальные параметры необязательны и
передаются через массив numberArray
. Причем поскольку этот массив представляет тип number[]
- массив чисел, то при вызове функции
для этого параметра мы можем передать нефиксированный набор значений, которые должны представлять тип number
.
TypeScript позволяет использовать массивы для передачи данных сразу нескольким параметрам. Рассмотрим следующий пример:
function sum(...args: number[]): number { let result = 0; for (let i = 0; i < args.length; i++) { result+= args[i]; } return result; } const numbers = [1, 3, 5, 7, 9] as const; let num = sum(...numbers); console.log(num); // 25
Здесь функция sum()
через массив args
принимает набор необязательных параметров. Этих параметров может быть неопределенное
количество - ноль, один, два, три...
Для передачи этим параметрам применяется оператор ..., после которого указывается массив значений:
let num = sum(...numbers);
То есть это аналогично тому, если бы мы написали
let num = sum(1, 3, 5, 7, 9);
Однако не всякий массив можно так передать. Обратите внимания, что для массива используется выражение as const:
const numbers = [1, 3, 5, 7, 9] as const;
Теперь возьмем функцию с фиксированным набором параметров:
function sum(a: number, b: number): number { return a + b; } const numbers = [1, 3, 5, 7, 9] as const; let num = sum(...numbers); // ! Ошибка - функция sum принимает только два параметра console.log(num); // 25
При компиляции данного кода мы получим ошибку. Поскольку функция sum()
теперь четко определяет два параметра. Однако при вызове ей передается
пять значений - [1, 3, 5, 7, 9]
. И в данном случае нам надо передать массив, который имеет столько элементов, сколько функция определяет обязательных параметров:
const numbers = [1, 3] as const; let num = sum(...numbers);
Если функция имеет необязательные параметры, то передаваемый массив значений может содержать для них значения, а может и не содержать:
function sum(a: number, b: number, c?: number): number { let result = a + b; if(c!==undefined) { result +=c;} return result; } const numbers1 = [1, 3] as const; let num1 = sum(...numbers1); // a = 1 b = 3 console.log(num1); // 4 const numbers2 = [1, 3, 7] as const; let num2 = sum(...numbers2); // a = 1 b = 3 c = 7 console.log(num2); // 11
При этом мы можем таким образом передавать значения разных типов в виде кортежа:
function printValues(name: string, age: number){ console.log(name); console.log(age); } const values = ["Tom", 36] as const; printValues(...values); // name = "Tom", age = 36
В данном случае функция printValues()
в качестве первого значения принимает значение string
, а в качестве второго - значение типа number
.
Набор values
как представляет набор значений подобных типов - ["Tom", 36]
. В итоге первое значение из кортежа values
сопоставляется
с первым параметром функции, а второе значение - со вторым параметрам. Важно, что передаваемые значения соответствовали по типам параметрам по позиции. Например, в
следующем случае мы получим ошибку:
const values = [36, "Tom"] as const; printValues(...values);
Так как первое значение из набора values
представляет тип number
, а первый параметр функции - тип string
. Соответственно
получаем несоответствие по типу данных.