跳到主要内容

简述TypeScript中const和readonly的区别是什么?枚举和常量的区别?

参考答案:

在TypeScript中,constreadonly都可以用来创建不可变的变量,但它们的使用场景和语义有所不同。

  1. constconst关键字用于声明一个只读的常量。一旦一个变量被声明为const,它的值就不能再被改变。需要注意的是,const仅对变量的引用进行限制,如果变量是一个对象或数组,其内容仍然可以被修改。
const myVar = 10;
myVar = 20; // Error: Cannot assign to 'myVar' because it is a constant.

const myObj = { prop: 10 };
myObj.prop = 20; // This is fine, 'myObj' still references the same object.
  1. readonlyreadonly关键字用于属性、索引签名或参数上,表示这些元素是只读的,不能在对象创建后被修改。如果尝试修改一个readonly属性,TypeScript编译器会报错。
class MyClass {
  readonly myProp: number;

  constructor(myProp: number) {
    this.myProp = myProp;
  }
}

const myInstance = new MyClass(10);
myInstance.myProp = 20; // Error: Cannot assign to 'myProp' because it is a read-only property.

枚举和常量的区别

  1. 用途:常量(使用constreadonly声明)用于存储不可变的值,可以是任何类型。枚举(使用enum声明)则是一种特殊的值类型,用于表示一组命名的常量。
  2. 语法:常量使用constreadonly关键字声明,而枚举使用enum关键字声明。
  3. 可变性:常量和枚举都是不可变的,一旦声明就不能改变。
  4. 可读性:枚举提供了一种更有组织的方式来管理相关的常量值,使得代码更具可读性。而常量通常用于存储单个的、不相关的值。
// 枚举示例
enum Colors {
  Red,
  Green,
  Blue
}

// 常量示例
const PI = 3.14159;
const MAX_SPEED = 100;
  1. 底层实现:枚举在TypeScript中被编译为JavaScript对象,每个枚举成员都是该对象的属性。而常量则是直接存储其值的变量。

总的来说,constreadonly都是用于创建不可变变量的工具,但它们的用法和语义略有不同。枚举则是一种特殊的值类型,用于表示一组相关的常量值。