Как типизировать массивы и кортежи в 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-кортеж литералов.