TypeScript返回immutable / const / readonly数组

时间:2018-04-24 13:36:04

标签: javascript typescript immutability readonly

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

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

4 个答案:

答案 0 :(得分:6)

这似乎有用......

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

答案 1 :(得分:4)

OP的代码自TypeScript 3.4 introduced a new syntax for ReadonlyArray开始有效:

  

当不使用const abilities = Array.from($('.info-unit').eq(6).find('.info-X3-33')).map(element => element.innerText)而不是ReadonlyArray时是一个好习惯   突变是有意的,考虑到数组有一个   更好的语法。具体来说,Array是的简写形式   number[],就像Array<number>Date[]的简写。

     

TypeScript 3.4使用新的Array<Date>引入了新语法   ReadonlyArray数组类型的修饰符。

此代码现在可以正常运行:

readonly

Playground

答案 2 :(得分: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);
}

答案 3 :(得分:1)

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

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