我想要一个返回数组的函数,但我希望返回的数组是只读的,所以当我尝试更改其内容时应该会收到警告/错误。
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 中实现吗?
这似乎有效...
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.
}
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
游乐场.
以下将使列表只读但其中的项目不是:
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
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);
}
您可以使用
Object.freeze
返回只读数组而不使用任何类型注释:
function getList() {
return Object.freeze([1,2,3]);
}
const list = getList();
list[2] = 5; // error
console.log(list);