在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 主要用于类属性和接口属性。