TypeScript 返回不可变/常量/只读数组

问题描述 投票:0回答:5

我想要一个返回数组的函数,但我希望返回的数组是只读的,所以当我尝试更改其内容时应该会收到警告/错误。

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 中实现吗?

javascript typescript immutability readonly
5个回答
34
投票

这似乎有效...

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

26
投票

自从 TypeScript 3.4 为

ReadonlyArray
引入了新语法以来,OP 中的代码现在可以使用了:

虽然在

ReadonlyArray
上使用
Array
是很好的做法 突变是有意的,考虑到数组有一个 更好的语法。具体来说,
number[]
Array<number>
,就像
Date[]
Array<Date>
的简写一样。

TypeScript 3.4 为

ReadonlyArray
引入了新的语法,使用新的
readonly
数组类型的修饰符。

此代码现在按预期工作:

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

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

游乐场.


5
投票

以下将使列表只读但其中的项目不是:

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

1
投票

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
投票

您可以使用

Object.freeze
返回只读数组而不使用任何类型注释:

function getList() {
  return Object.freeze([1,2,3]);
}

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

console.log(list);
© www.soinside.com 2019 - 2024. All rights reserved.