Массивы и кортежи (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.