Кортеж - масив фіксованої структури: відомо, скільки елементів і якого типу кожен.
type Point = [number, number];
type Entry = [key: string, value: number]; // іменовані елементи
const p: Point = [10, 20];
const [x, y] = p;
Імена елементів (key, value) нічого не змінюють у поведінці - вони лише для читабельності й підказок редактора.
Де кортежі зустрічаються:
- повернення кількох значень:
useStateв React повертає[value, setValue]- кортеж, тому деструктуризація дає правильні типи кожному елементу; Object.entries, пари ключ-значення;- параметри функцій як кортеж:
Parameters<typeof fn>- кортеж типів аргументів.
Необов'язкові елементи - лише в кінці:
type Range = [start: number, end?: number];
const r1: Range = [1];
const r2: Range = [1, 5];
Залишкові (rest) елементи - змінна довжина:
type Command = [name: string, ...args: string[]];
type WithFlag = [...items: number[], flag: boolean]; // rest може бути й не в кінці
Варіадичні кортежі - комбінування типів кортежів у узагальненнях:
function concat<A extends unknown[], B extends unknown[]>(a: [...A], b: [...B]): [...A, ...B] {
return [...a, ...b];
}
const result = concat([1, 'a'], [true]); // [number, string, boolean]
Так типізуються функції-обгортки, що додають аргументи на початок чи в кінець (bind, middleware, каррування).
Пастки:
- виведення типу масиву - не кортеж:
const pair = [1, 'a']має тип(string | number)[]. Для кортежу - анотація абоas const(тодіreadonly [1, 'a']); - кортеж можна змінити через методи масиву:
point.push(30)компілюється для звичайного кортежу.readonly [number, number]це забороняє; - довгі кортежі погано читаються: якщо елементів більше 2-3, краще об'єкт з іменованими полями -
{ lat, lng }замість[number, number].