TypeScript возвращает неизменяемый массив/const / readonly

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

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 ответов


Это, кажется, работает...

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

const list = getList();

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

попробуйте в площадка

ReadonlyArray<T> реализован следующим образом:

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

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

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

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

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

for (const n of list) {
    console.log(n);
}

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

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