Почему я не могу сделать Array только для чтения таким образом в TypeScript?

Документация показывает (#ReadOnlyArray), как это сделать с помощью интерфейса, но, изучая язык, я удивился, почему это не работает так же хорошо?

type TraverseTuple<T extends Array<unknown>> = {
     readonly [P in keyof T]: T[P];
}

const test: TraverseTuple<[string, number, string, number]> = ['s', 1, 'o', 2];

test[1] = 0; // not readonly !

2 ответа

Существует встроенный тип массива только для чтения, который делает массивы только для чтения (если только они не возвращены в простой массив).

const test: ReadonlyArray<string|number> = ['s', 1, 'o', 2];

test[1] = 0;

Но для кортежей вам нужно создать явный тип, например так:

const test: Readonly<{ 0: string, 1: number, 2: string, 3: number }> = ['s', 1, 'o', 2];

test[1] = 1;

Такое поведение специально не поддерживается. Способность отображать кортежи была недавно введена в машинописный текст 3.1 с этим PR. Из пиара:

readonly, -readonly, или же +readonly аннотация в гомоморфном отображаемом типе в настоящее время не влияет на элементы массива или кортежа (мы могли бы рассмотреть отображение из Array в ReadonlyArray и наоборот, хотя это технически не сохраняет структуру, потому что она добавляет или удаляет методы).

Другие вопросы по тегам