В TypeScript массивы можно строго типизировать, указывая тип элементов через запись type[] или Array<type>. Например:
let arr: number[] = [1, 2, 3];
Кортежи — это массивы c фиксированной длиной и типами для каждого элемента:
let tuple: [string, number] = ["age", 30];
Подводные камни:
push не запрещён, но результат уже выходит за пределы гарантированной типизации.Могут ли кортежи в TypeScript содержать переменное количество элементов, и как это повлияет на типизацию?
Ответ: Да, кортежи могут содержать остаточные элементы с помощью синтаксиса ..., но всё равно требуют строгой типизации оставшихся элементов:
let tuple: [string, ...number[]] = ["id", 10, 20, 30];
Однако элементы до ... обязаны быть указаны, а тип для остального массива — единый.
История
В проекте e-commerce разработчик пытался сохранить в кортеж [string, number] больше двух элементов с помощью push. Это не дало ошибку на этапе компиляции, но сломало работу функции, ждавшей ровно два элемента, что привело к ошибкам при разборе заказов.
История
Функция возвращала кортеж [string, number], однако потребитель ожидал массив строк. Несовпадение типов дало трудноуловимую ошибку, из-за чего в production ушли некорректные значения.
История
При миграции кода с JavaScript на TypeScript были использованы массивы вместо кортежей для возврата нескольких значений разного типа. Это нарушило строгую типизацию и привело к появлению багов в последующем коде, полагавшемся на порядок и тип значений.