Массивы и кортежи (tuple)

Типизируем коллекции: однородные массивы и кортежи с фиксированной структурой.

Кортеж (tuple) — массив фиксированной длины, где у каждой позиции свой заранее известный тип.

Типизация массивов

Массив обычно содержит элементы одного типа. Записать это можно двумя равнозначными способами:

let scores: number[] = [10, 20, 30];
let names: Array<string> = ["Аня", "Боря"];

Запись number[] читается как «массив чисел». Форма Array<string> — то же самое через дженерик (о дженериках — в последнем разделе). Чаще используют короткую форму с квадратными скобками.

Теперь массив защищён: положить туда чужой тип нельзя.

scores.push(40);      // ок
scores.push("сорок"); // Ошибка: Argument of type 'string' is not assignable to parameter of type 'number'.

Зачем это на практике

Типизированный массив гарантирует, что когда вы переберёте его в цикле, каждый элемент будет ожидаемого типа — и редактор подскажет доступные методы. Реальный пример:

const prices = [199, 349, 89, 450];
const sum = prices.reduce((acc, p) => acc + p, 0);
const max = Math.max(...prices);

console.log("Всего:", sum);
console.log("Самый дорогой:", max);

Вывод:

Всего: 1087
Самый дорогой: 450

Кортежи (tuple)

Иногда массив используют как структуру с фиксированными позициями: первый элемент — одно, второй — другое. Обычный number[] такого не выразит. Здесь нужен кортеж:

let point: [number, number] = [10, 20];   // координаты x, y
let user: [string, number] = ["Аня", 30]; // имя и возраст

Кортеж жёстко задаёт и длину, и тип каждой позиции:

user = [30, "Аня"];  // Ошибка: порядок типов нарушен
user = ["Аня"];      // Ошибка: не хватает элемента

Где кортежи спасают

Классический пример — функция, возвращающая пару значений. Так устроен, например, useState в React: он отдаёт кортеж из значения и функции его изменения.

function useCounter(): [number, () => void] {
  let count = 0;
  const increment = () => { count++; };
  return [count, increment];
}

const [value, inc] = useCounter(); // value: number, inc: функция

Благодаря кортежу TypeScript точно знает: value — число, а inc — функция. При деструктуризации типы каждой позиции сохраняются.

Массив или кортеж?

КогдаЧто брать
Список однотипных элементов, длина любаямассив: number[]
Фиксированный набор разнотипных значенийкортеж: [string, number]
Пара «значение + функция» из хукакортеж

Итог

  • Массив типизируется как тип[] или Array<тип> — обе формы равнозначны.
  • Кортеж [A, B] фиксирует длину и тип каждой позиции.
  • Кортежи удобны для функций, возвращающих несколько значений, и для пар как в useState.
Проверьте себя
1. Чем кортеж (tuple) отличается от обычного массива?
AКортеж быстрее работает в рантайме
BКортеж фиксирует длину и тип каждой позиции, а массив — нет
CКортеж может хранить только числа
DМежду ними нет разницы
2. Какие две записи типизируют массив чисел одинаково?
Anumber[] и Array<number>
Bnumber{} и {number}
C[number] и number()
Dnum[] и numbers
3. Почему присваивание user = [30, "Аня"] кортежу [string, number] вызовет ошибку?
AКортежи не поддерживают строки
BНарушен порядок типов: на первой позиции ожидается string, а не number
CВ кортеже нельзя менять значения
DСлишком много элементов
Поддержать проект