Почему я не могу сделать 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
и наоборот, хотя это технически не сохраняет структуру, потому что она добавляет или удаляет методы).