PassFront
  1. PassFront
  2. База знаний
  3. Массивы и коллекции

Как типизировать массивы и кортежи в TypeScript и чем readonly массив отличается от обычного?

Массивы и коллекции

Массив типизируют как T[] или Array<T>, а кортеж описывает массив фиксированной длины с типом на каждой позиции.

const ids: number[] = [1, 2, 3];
const names: Array<string> = ['Ada', 'Linus'];

const pair: [string, number] = ['age', 30];
const named: [name: string, age: number] = ['Ada', 36];
const optional: [string, number?] = ['x'];
const rest: [string, ...number[]] = ['scores', 1, 2, 3];

readonly

const list: readonly number[] = [1, 2, 3];
// list.push(4);   // Ошибка: у readonly нет мутирующих методов
const copy = [...list, 4];

function sum(values: readonly number[]) { /* нельзя изменить аргумент */ }

readonly T[] защищает от мутаций на уровне типов, а на рантайме это обычный массив. Обычный T[] можно передать там, где ждут readonly T[], а обратно нельзя.

Практика

  • Параметры функций, которые только читают массив, типизируйте как readonly T[].
  • Для as const массив превращается в readonly-кортеж литералов.
  • noUncheckedIndexedAccess делает arr[i] типом T | undefined, что безопаснее.

Коротко для собеседования

Массив типизируют как T[], кортеж задаёт тип на каждой позиции, readonly запрещает изменять массив. as const превращает массив в readonly-кортеж литералов.

Другие вопросы раздела