TypeScript中const声明的对象结构指什么?哪些操作会编译报错
“对象结构”的具体指代
技术表述里提到的const不允许修改的“对象结构”,对应两层核心约束,分别和JavaScript原生语法、TypeScript类型校验规则直接相关:
- 第一层是JavaScript原生const的语法限制:const声明的变量在初始化后,就和初始值所在的内存地址建立不可变绑定,这个绑定关系本身就是表述里说的核心「结构」,你不能切断这个绑定,让变量转而指向其他内存地址上的新值。
- 第二层是TypeScript的类型校验限制:const声明的对象、数组完成初始化时,TS会自动推断出它的顶层类型,比如示例中的
numbers会被推断为元素全为数字的数组类型number[],你不能给这个变量赋值和顶层类型不兼容的值,打破它的类型边界。
你示例里写的numbers.push(4),本质是在原数组已经占用的内存空间里新增元素,既没有改动numbers和原数组的绑定关系,也没有改变它number[]的顶层类型,属于修改对象内部子属性/元素的操作,所以不会触发报错。
会触发编译错误的代码示例
只要是对numbers变量本身做重新赋值、打破原有绑定或顶层类型的操作,都会触发编译错误,典型示例如下:
- 直接给变量重新赋值一个全新的数组,哪怕新数组的元素也全是数字类型,依然会违反const的绑定规则报错:
// 编译错误:Cannot assign to 'numbers' because it is a constant. numbers = [4, 5, 6];
- 给变量赋值非数组类型的其他值,既违反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
相关产品推荐
相关产品推荐

