TypeScript返回immutable/const/readonly数组

Cri*_*sty 11 javascript readonly immutability typescript

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

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
Run Code Online (Sandbox Code Playgroud)

这可以在TypeScript中实现吗?

Bor*_*ard 18

来自 OP 的代码现在可以工作了,因为TypeScript 3.4 引入了一种新的语法ReadonlyArray

虽然在不打算改变的情况下使用ReadonlyArrayover是一种很好的做法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
Run Code Online (Sandbox Code Playgroud)

游乐场


ser*_*0ne 9

这看似有效......

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

const list = getList();

list[0] = 3; // Index signature in type 'ReadonlyArray<number>' only permits reading.
Run Code Online (Sandbox Code Playgroud)

游乐场尝试一下

ReadonlyArray<T> 像这样实现:

interface ReadonlyArray<T> {
    readonly [n: number]: T;
    // Rest of the interface removed for brevity.
}
Run Code Online (Sandbox Code Playgroud)


Avr*_*dis 5

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

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

let list = getList();
list = 10; // error
list[1] = 5 // that is fine
Run Code Online (Sandbox Code Playgroud)

这将使列表及其项目成为只读:

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

let list = getList();
list = 10; // error
list[1] = 5 // error as well
Run Code Online (Sandbox Code Playgroud)