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

В документации (#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 ]

0 голосов
/ 28 декабря 2018

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

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

0 голосов
/ 28 декабря 2018

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

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;
...