TS中const和readonly的区别

简介: TS中const和readonly的区别

在TypeScript(TS)中,const 和 readonly 都是用于确保变量或属性不被重新赋值的工具,但它们的使用场景和语义有所不同。


1.作用域和生命周期:

const 用于声明一个变量,并且这个变量的值在初始化后不能被重新赋值。它的作用域和生命周期取决于它被声明的位置。如果它在函数内部被声明,那么它的作用域就是该函数内部;如果它在全局作用域或模块作用域中声明,那么它的作用域就是整个文件或模块。

readonly 通常用于类属性或接口属性。它确保该属性在对象被创建后不能被修改。readonly 属性的作用域和生命周期与类的实例或接口的使用相关。

2.使用场景:

const 主要用于声明常量,这些常量可以是基本类型(如数字、字符串、布尔值)、对象字面量、数组字面量等。一旦初始化,这些值就不能再被改变。

readonly 主要用于类属性,确保类的实例在创建后,这些属性的值不会被改变。它也可以用于接口,以表示接口的实现者必须提供一个只读属性。

3.语法和用途:

const 声明一个不可变的变量绑定。它告诉TypeScript编译器该变量引用一个不能被重新赋值的值。

readonly 修饰类属性时,通常与类的构造函数一起使用,以确保在对象创建时初始化属性,并且在之后不被修改。它也可以用于接口,表示该属性在接口的实现中应该是只读的。

4.类型兼容性:

由于 const 变量不可重新赋值,它的类型在初始化后就固定了。尝试给 const 变量赋一个与初始类型不兼容的值会导致编译错误。

readonly 属性也具有固定的类型,但不同的是,它的类型由类的构造函数或接口定义决定。

示例:


// 使用 const 声明一个常量 
  const myConstant: string = "Hello, World!"; 
  // myConstant = "Goodbye, World!"; // 编译错误,不能重新赋值 
  // 使用 readonly 在类中声明一个只读属性 
  class MyClass { 
  readonly myProperty: string; 
  constructor(value: string) { 
  this.myProperty = value; 
  // this.myProperty = "another value"; // 编译错误,不能在类的方法中修改 readonly 属性 
  } 
  } 
  // 使用 readonly 在接口中声明一个只读属性 
  interface MyInterface { 
  readonly interfaceProperty: string; 
  } 
  const myObject: MyInterface = { 
  interfaceProperty: "Interface Property Value" 
  }; 
  // myObject.interfaceProperty = "new value"; // 编译错误,不能修改接口实现的只读属性


总的来说,const 和 readonly 在TypeScript中都是用来实现不可变性的,但它们的用途和上下文有所不同。const 主要用于变量,而 readonly 主要用于类属性和接口属性。


相关文章
|
4天前
|
JavaScript
TS中 type和interface的区别
TS中 type和interface的区别
14 0
|
4天前
|
JavaScript
const和readonly的区别
const和readonly的区别
|
4天前
|
JavaScript 前端开发 索引
TS - interface和type的区别
TS - interface和type的区别
23 0
|
7月前
Angular Component 里使用 const 和 readonly 修饰的属性有什么区别
Angular Component 里使用 const 和 readonly 修饰的属性有什么区别
32 0
|
8月前
|
JavaScript
ts - 重载
重载允许一个函数接受不同数量或类型的参数时,作出不同的处理。
|
11月前
|
存储 JavaScript
【TS】object类型
【TS】object类型
53 0
|
JavaScript 前端开发
ES6——let、const
ES6——let、const
93 0
|
JavaScript 前端开发
【ES6】 let与const详解
【ES6】 let与const详解
|
JavaScript
ES6中let与const的区别
ES6中let与const的区别