ПрограммированиеFrontend разработчик / Разработчик TypeScript

Как реализуется и зачем используется строгая типизация массивов и кортежей (tuples) в TypeScript? В чем их различия и подводные камни при использовании?

Проходите собеседования с ИИ помощником Hintsage

Ответ

В TypeScript массивы можно строго типизировать, указывая тип элементов через запись type[] или Array<type>. Например:

let arr: number[] = [1, 2, 3];

Кортежи — это массивы c фиксированной длиной и типами для каждого элемента:

let tuple: [string, number] = ["age", 30];
  • Массив: допускает любое количество элементов одного типа.
  • Кортеж: жёстко фиксирует количество и порядок типов. Позволяет создавать структуры наподобие записей или возвращать из функции значения разного типа.

Подводные камни:

  • При использовании методов массивов (push, pop) над кортежами push не запрещён, но результат уже выходит за пределы гарантированной типизации.
  • Неосторожное расширение кортежа приводит к "небезопасному" коду.
  • Деструктуризация кортежей в функциях: ошибочно указанный тип или длина повлечёт ошибку.

Вопрос с подвохом

Могут ли кортежи в TypeScript содержать переменное количество элементов, и как это повлияет на типизацию?

Ответ: Да, кортежи могут содержать остаточные элементы с помощью синтаксиса ..., но всё равно требуют строгой типизации оставшихся элементов:

let tuple: [string, ...number[]] = ["id", 10, 20, 30];

Однако элементы до ... обязаны быть указаны, а тип для остального массива — единый.

Примеры реальных ошибок из-за незнания тонкостей темы


История

В проекте e-commerce разработчик пытался сохранить в кортеж [string, number] больше двух элементов с помощью push. Это не дало ошибку на этапе компиляции, но сломало работу функции, ждавшей ровно два элемента, что привело к ошибкам при разборе заказов.


История

Функция возвращала кортеж [string, number], однако потребитель ожидал массив строк. Несовпадение типов дало трудноуловимую ошибку, из-за чего в production ушли некорректные значения.


История

При миграции кода с JavaScript на TypeScript были использованы массивы вместо кортежей для возврата нескольких значений разного типа. Это нарушило строгую типизацию и привело к появлению багов в последующем коде, полагавшемся на порядок и тип значений.