You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript能否实现返回只读数组并在修改时触发编译错误?

当然可以在TypeScript中实现这个需求!

你的示例代码其实已经正确利用了TypeScript的只读数组类型来实现编译时的修改阻止,我们来拆解一下细节:

编译层面的只读约束

你写的readonly number[]类型(等价于ReadonlyArray<number>)正是TypeScript专门用来标记数组为只读的类型。当你把函数返回值标注为这个类型后:

function getList(): readonly number[] { return [1,2,3]; }
const list = getList();
list[2] = 5; // 这里会直接触发TypeScript编译错误

TypeScript的类型检查器会严格禁止对该数组进行任何修改操作(包括索引赋值、调用push/pop等修改原数组的方法),完全满足你“返回的列表绝不能被修改”的编译期要求。

关于运行时的额外保护

需要注意的是,readonly只是编译时的类型约束,编译后的JavaScript代码里,这个数组还是普通的可变数组。如果有人绕过TypeScript编译(比如直接用JavaScript调用这个函数,或者用any类型强制转换),还是能修改数组内容的。

如果需要在运行时也阻止数组被修改,可以结合Object.freeze()方法:

function getList(): readonly number[] {
  // Object.freeze会冻结数组,使其在运行时无法被修改
  return Object.freeze([1,2,3]);
}

这样在严格模式下,尝试修改数组会抛出TypeError;非严格模式下修改操作会静默失败,进一步强化了只读的约束。

总结

你的原始代码已经完美实现了编译时的只读检查需求,TypeScript会准确触发你期望的编译错误。如果需要运行时的额外保护,加上Object.freeze()即可。

内容的提问来源于stack exchange,提问作者XCS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:25:15