1. TypeScript中的引用与常量基础
在TypeScript开发中,变量声明方式的选择直接影响代码的可维护性和可靠性。const作为ES6引入的常量声明关键字,与传统的let和var相比具有独特的特性。当处理对象和数组这类引用类型时,const的行为常常让开发者感到困惑。
const声明的本质是创建一个不可变的绑定(immutable binding),而非不可变的值。这意味着:
- 对于基本类型(number, string, boolean等),值确实不可变
- 对于引用类型(object, array等),引用地址不可变,但对象内容可以修改
typescript复制const PI = 3.14;
PI = 3.14159; // 报错:无法分配到常量
const user = { name: 'Alice' };
user.name = 'Bob'; // 合法操作
user = {}; // 报错:无法分配到常量
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 引用类型的const陷阱与解决方案
2.1 对象属性的可变性
虽然const可以防止引用被重新赋值,但对象内部属性仍然可变。这在需要真正不可变数据时可能带来问题:
typescript复制const config = {
apiUrl: 'https://api.example.com',
timeout: 5000
};
// 意外修改风险
config.timeout = 10000; // 合法但可能不符合预期
解决方案:
-
使用
Object.freeze()浅冻结对象typescript复制const config = Object.freeze({ apiUrl: 'https://api.example.com', timeout: 5000 }); config.timeout = 10000; // 严格模式下报错 -
使用
Readonly类型标记typescript复制interface IConfig { readonly apiUrl: string; readonly timeout: number; } const config: IConfig = { apiUrl: 'https://api.example.com', timeout: 5000 };
2.2 数组元素的修改
数组作为引用类型同样面临类似问题:
typescript复制const colors = ['red', 'green', 'blue'];
colors.push('yellow'); // 合法操作
colors = []; // 报错
**不可变数
