TypeScript 中 readonly 和 const 的区别

💡 原文英文,约400词,阅读约需2分钟。
📝

内容提要

const和readonly都是不可重新分配的特性。const防止对变量进行重新分配,而readonly防止对属性进行重新分配。通过结合const和readonly,可以创建一个既不可重新分配变量本身,也不可重新分配对象属性的对象。

🔎

延伸解读

const 与 readonly 的作用层级不同

const 作用于变量本身,防止变量被重新赋值;readonly 作用于属性,防止属性被重新赋值。两者虽然都涉及“不可重新分配”,但约束的对象不同:一个针对变量标识符,一个针对对象属性。理解这一层级差异是区分它们的关键。

const 对象的属性仍可修改

使用 const 声明的对象,其属性是可以被重新赋值的。例如,const hisFamily = { brother: 'Lincoln Burrows' } 后,可以执行 hisFamily.brother = '' 来修改属性,但不能执行 hisFamily = { mother: 'Christina Rose Scofield' } 来重新分配变量。这说明 const 只保护变量绑定,不保护对象内部状态。

readonly 允许变量重新分配

readonly 修饰的属性不可重新赋值,但变量本身可以被重新分配。例如,let hisFamily: { readonly brother: string } = { brother: 'Lincoln Burrows' } 后,hisFamily.brother = '' 会报错,但 hisFamily = { brother: '' } 是允许的。这表明 readonly 只限制属性写入,不限制变量指向新对象。

结合使用实现完全不可变

通过同时使用 const 和 readonly,可以创建变量本身和对象属性都不可重新分配的对象。例如,const hisFamily: { readonly brother: string } = { brother: 'Lincoln Burrows' } 后,无论是 hisFamily.brother = '' 还是 hisFamily = { brother: '' } 都会导致编译错误。这种组合提供了更严格的不可变性保证。

❓

Q&A

const和readonly的主要区别是什么?

const防止对变量本身进行重新分配,而readonly防止对对象属性进行重新分配。

如何使用const和readonly创建不可变对象?

可以结合使用const和readonly,创建一个既不可重新分配变量本身,也不可重新分配对象属性的对象。

使用const时可以对变量进行哪些操作?

使用const时,变量本身不可重新分配,但可以修改其属性。

readonly属性的作用是什么?

readonly属性防止对该属性进行重新分配,确保属性值不可变。

如果我尝试修改readonly属性,会发生什么?

如果尝试修改readonly属性,将会出现编译错误。

可以同时使用const和readonly吗?

可以同时使用const和readonly,以确保变量和属性都不可重新分配。

🏷️

标签

➡️

继续阅读