我想要一个返回一个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中实现吗?
答案 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.
中试用
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
答案 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