Неопределенный набор и наполнение параметров

Последнее обновление: 15.05.2021

Неопределенный набор параметров

Если необходимо, чтобы функция принимала набор однотипных параметров, то используется знак многоточия, после которого идет массив:

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. Соответственно получаем несоответствие по типу данных.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850