TypeScript的readonly属性中"signal intent"表述的实际含义是什么
关于TypeScript中
readonly意图声明作用的解释 那句话的核心可以拆成两个核心点理解:
1. 「signal intent(声明意图)」的两层含义
- 给TypeScript编译器传递信号:你通过
readonly明确告知编译器,这个属性设计上就是不允许直接修改的。后续如果代码里出现直接修改该属性的操作,编译器会在开发阶段直接抛出错误,提前拦截误操作。
举个实际示例:interface Order { readonly orderId: string; amount: number; } const order: Order = { orderId: '20240501001', amount: 100 }; order.orderId = '20240501002'; // 编译器会直接报错,提示不能修改只读属性 - 给协作的其他开发者传递信号:看代码的人看到
readonly修饰符,不需要额外看注释或者业务逻辑,就能立刻知道这个属性是不可变的设计,不会随意编写修改该属性的逻辑,降低协作沟通成本。
2. 为什么要特意强调「合理预期readonly的作用」
很多新手会误以为readonly是给属性加了运行时的不可变保护,这是错误的预期:
TypeScript在校验两个类型是否兼容时,不会考虑属性是否为
readonly修饰,因此readonly属性也可能通过别名被修改。
比如下面的代码是完全合法的,修改别名的可变属性会同步修改readonly属性的值:
interface MutableOrder { orderId: string; amount: number; } const mutableOrder: MutableOrder = { orderId: '20240501001', amount: 100 }; const order: Order = mutableOrder; mutableOrder.orderId = '20240501002'; // 这里修改别名的可变属性完全合法 console.log(order.orderId); // 输出结果是 20240501002,readonly属性被修改了
所以readonly没有运行时保护能力,它的全部价值都集中在开发阶段的意图提示,你要合理预期它的作用边界,不要指望它能完全阻止属性被修改。
内容的提问来源于stack exchange,提问作者Chor
相关产品推荐
相关产品推荐

