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

TypeScript中const声明的对象结构指什么?哪些操作会编译报错

“对象结构”的具体指代

技术表述里提到的const不允许修改的“对象结构”,对应两层核心约束,分别和JavaScript原生语法、TypeScript类型校验规则直接相关:

  • 第一层是JavaScript原生const的语法限制:const声明的变量在初始化后,就和初始值所在的内存地址建立不可变绑定,这个绑定关系本身就是表述里说的核心「结构」,你不能切断这个绑定,让变量转而指向其他内存地址上的新值。
  • 第二层是TypeScript的类型校验限制:const声明的对象、数组完成初始化时,TS会自动推断出它的顶层类型,比如示例中的numbers会被推断为元素全为数字的数组类型number[],你不能给这个变量赋值和顶层类型不兼容的值,打破它的类型边界。

你示例里写的numbers.push(4),本质是在原数组已经占用的内存空间里新增元素,既没有改动numbers和原数组的绑定关系,也没有改变它number[]的顶层类型,属于修改对象内部子属性/元素的操作,所以不会触发报错。

会触发编译错误的代码示例

只要是对numbers变量本身做重新赋值、打破原有绑定或顶层类型的操作,都会触发编译错误,典型示例如下:

  1. 直接给变量重新赋值一个全新的数组,哪怕新数组的元素也全是数字类型,依然会违反const的绑定规则报错:
// 编译错误:Cannot assign to 'numbers' because it is a constant.
numbers = [4, 5, 6];
  1. 给变量赋值非数组类型的其他值,既违反const绑定规则,也违反类型匹配规则:
// 编译错误:无法给常量赋值,同时存在类型不匹配问题
numbers = "test string";
numbers = { value: 1 };
numbers = 1234;
numbers = null;

补充说明:如果声明数组时额外加了as const类型断言(写成const numbers = [1, 2, 3] as const),TS会把它推断为值固定的只读元组类型readonly [1, 2, 3],此时哪怕是push新增元素、按下标修改元素这类不改变引用的操作,也会报类型错误。但这个限制是as const断言带来的只读类型约束,不是const关键字本身的规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 18:45:38