第 212 题:TypeScript 中 const 和 readonly 的区别?枚举和常量枚举的区别?
被 readonly
标记的属性只能在声明时或类的构造函数中赋值。
之后将不可改(即只读属性),否则会抛出 TS2540
错误。
与 ES6 中的 const
很相似,但 readonly
只能用在类(TS 里也可以是接口)中的属性上,相当于一个只有 getter
没有 setter
的属性的语法糖。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
const和readonly其实是两个层面的定义。
const 定义的变量本身是readonly的,但内部属性不是
这个如果要同时使其属性变为只读,则可以使用 readonly 关键字,此时定义偏向于灵活,可以选择直接定义为字面量或者是某种类型:
当然,ts提供了一些语法糖来快速将对象属性变为readonly:
TypeScript 中 const 与 readonly 的区别?
TypeScript 中不可变量的实现方法有两种:
TypeScript 中 readonly
TypeScript 中的只读修饰符,可以声明更加严谨的可读属性
通常在
interface
、Class
、type
以及array
和tuple
类型中使用它,也可以用来定义一个函数的参数区别
const
用于变量,readonly
用于属性const
在运行时检查,readonly
在编译时检查const
声明的变量不得改变值,这意味着,const
一旦声明变量,就必须立即初始化,不能留到以后赋值;readonly
修饰的属性能确保自身不能修改属性,但是当你把这个属性交给其它并没有这种保证的使用者(允许出于类型兼容性的原因),他们能改变此时,需要
iMutateFoo
明确的表示,他们的参数不可修改,那么编译器会发出错误警告:const
保证的不是变量的值不得改动,而是变量指向的那个内存地址不得改动,例如使用const
变量保存的数组,可以使用push
,pop
等方法。但是如果使用ReadonlyArray<number>
声明的数组不能使用push
,pop
等方法。枚举和常量枚举的区别?
枚举和常量枚举(const枚举)
使用枚举可以清晰地表达意图或创建一组有区别的用例
区别
const
枚举会在 typescript 编译期间被删除,const
枚举成员在使用的地方会被内联进来,避免额外的性能开销原文