简述TypeScript中const和readonly的区别是什么?枚举和常量的区别?
const
vs readonly
在TypeScript中,const
和readonly
都用于声明不可变的值,但它们的应用场景和用法有所不同。
const
const
是用来定义常量的关键字,它可以在全局作用域、模块作用域或块作用域内使用。- 一旦被赋值,
const
声明的变量就不能再被重新赋值。 const
用于变量声明。
const pi = 3.14;
pi = 3.14159; // 编译错误:不能给pi重新赋值
readonly
readonly
是一个用在类的属性或接口的属性前的修饰符,表示该属性一旦被初始化之后就不能再被修改。readonly
属性必须在声明时或构造函数里被初始化。readonly
用于类或接口的属性。
class Circle {
readonly pi = 3.14;
constructor(public readonly radius: number) {}
}
let c = new Circle(10);
c.pi = 3.14159; // 编译错误:不能给pi重新赋值
c.radius = 20; // 编译错误:不能给radius重新赋值
枚举(Enums)vs 常量
枚举(Enums)
- 枚举是TypeScript提供的一种特性,用于定义一组命名的常数。
- 枚举通过
enum
关键字定义,可以为一组数值提供更友好的名字。 - 枚举值默认从0开始自增,但你可以手动设置成员的值。
enum Color {
Red, // 0
Green, // 1
Blue // 2
}
let c: Color = Color.Green;
- 枚举是在运行时真正存在的对象,可以反向映射从数值到枚举名。
常量
- 常量可以是任何基本类型或用户定义的复杂类型的不可变的值。
- 常量使用
const
关键字声明。 - 常量在编译后的JavaScript代码中不会创建一个真实的对象或数组,它们的值在编译时就已经确定。
const pi = 3.14;
const maxNumber = Number.MAX_VALUE;
总结
const
用于变量声明,其作用域可以是全局的、模块的或块级的,一旦赋值后不可更改。readonly
用于类和接口中的属性,一旦在构造函数内或声明时被赋值后不可更改。- 枚举(Enums)提供了一种为一组相关的值定义友好名称的方法,是在运行时存在的。
- 常量是不可改变的值,可以是任何类型,其值在编译时已经确定。