TypeScript возвращает неизменяемый / постоянный / только для чтения массив - PullRequest
0 голосов
/ 24 апреля 2018

Я хочу иметь функцию, которая возвращает массив, но я хочу, чтобы возвращаемый массив был доступен только для чтения, поэтому я должен получить предупреждение / ошибку при попытке изменить его содержимое.

function getList(): readonly number[] {
   return [1,2,3];
}


const list = getList();
list[2] = 5; // This should result in a compile error, the returned list should never be changed

Может ли это быть достигнуто в TypeScript?

Ответы [ 3 ]

0 голосов
/ 24 апреля 2018

TypeScript имеет тип ReadonlyArray<T>, который делает это:

TypeScript поставляется с типом ReadonlyArray, который совпадает с типом Array, при этом все методы мутации удалены, поэтому вы можете быть уверены, что не изменили свои массивы после создания

function getList(): ReadonlyArray<number> {
   return [1,2,3];
}

const list = getList();
list[2] = 5; // error

for (const n of list) {
    console.log(n);
}
0 голосов
/ 24 апреля 2018

Следующий список сделает список доступным только для чтения, но элементы в нем не будут:

function getList(): Readonly<number[]> {
   return [1,2,3];
}

let list = getList();
list = 10; // error
list[1] = 5 // that is fine

А этот список сделает список и элементы только для чтения:

function getList(): ReadonlyArray<number> {
   return [1,2,3];
}

let list = getList();
list = 10; // error
list[1] = 5 // error as well
0 голосов
/ 24 апреля 2018

Кажется, что это работает ...

function getList(): ReadonlyArray<number> {
    return [1, 2, 3];
}

const list = getList();

list[0] = 3; // Index signature in type 'ReadonlyArray<number>' only permits reading.

Попробуйте на Playground

ReadonlyArray<T> реализовано так:

interface ReadonlyArray<T> {
    readonly [n: number]: T;
    // Rest of the interface removed for brevity.
}
...