const与readonly详解

简介: const与readonly详解

const与readonly详解


今天,我们将深入探讨在TypeScript中常用的constreadonly关键字,了解它们的作用、使用场景以及区别。


什么是const与readonly?

在TypeScript中,constreadonly都是用于声明常量或只读变量的关键字,但它们在使用场景和行为上有一些不同之处。

const关键字

const用于声明常量,一旦赋值后就不能再修改。示例代码如下:

const PI = 3.14;
// PI = 3.14159; // Error: Cannot assign to 'PI' because it is a constant.

readonly关键字

readonly用于声明只读属性,可以在声明时或构造函数中初始化,但之后就不能再修改。示例代码如下:

class Circle {
    readonly radius: number;
    constructor(radius: number) {
        this.radius = radius;
    }
    // radius cannot be modified in other methods
}

区别与使用场景

  1. const适用于基本数据类型和对象引用: const适用于声明基本数据类型和引用类型的常量,但对于引用类型,只是保证引用地址不变,而非对象的内部属性不变。
const name: string = "John";
const person: { age: number } = { age: 25 };
// For objects, properties can still be modified
person.age = 26;
  1. readonly适用于类属性和数组: readonly更适用于类的属性和数组,用于确保对象属性或数组元素的不可修改性。
class Car {
    readonly brand: string;
    constructor(brand: string) {
        this.brand = brand;
    }
}
const myCar = new Car("Toyota");
// myCar.brand = "Honda"; // Error: Cannot assign to 'brand' because it is a read-only property.
const numbers: readonly number[] = [1, 2, 3];
// numbers.push(4); // Error: Property 'push' does not exist on type 'readonly number[]'.
  1. const是编译时常量,readonly是运行时常量: const是在编译时计算并内联的常量,而readonly是在运行时进行检查的。
const dynamicValue = Math.random(); // computed at runtime
const CONST_VALUE = dynamicValue; // Error: Initializer of 'CONST_VALUE' is not a constant expression.

注意事项

  1. const的注意事项: 对于复杂对象,const只能保证其引用地址不变,内部属性可变。
  2. readonly的注意事项: readonly适用于类的实例属性和数组,但在一些情况下可能需要使用const辅助。

结语

通过深入了解constreadonly关键字,我们能更灵活地使用它们来保障代码的可维护性和可读性。

相关文章
|
C语言
【C语言】exit函数详解
【C语言】exit函数详解
3149 0
|
Shell 开发工具 git
brew - 常用命令
brew - 常用命令
1375 0
|
资源调度 前端开发 JavaScript
React的测试:使用Jest和React Testing Library进行深入探索
【4月更文挑战第25天】本文探讨了使用Jest和React Testing Library进行React测试的方法。Jest是Facebook推出的JavaScript测试框架,适合React测试,提供全面的API和功能。React Testing Library侧重于组件行为,提倡按用户交互方式测试。安装这两个工具后,可通过编写测试用例(如模拟点击事件)来验证组件功能。运行Jest可执行测试并显示结果。此外,还介绍了高级测试技巧和模拟功能,强调了它们对于确保组件正确性、提升开发效率的重要性。
|
存储 Java API
开源对象存储服务(MinIO),正在备受欢迎!
本文介绍了MinIO,一个高性能、开源的对象存储服务器,兼容Amazon S3 API,适合存储大量非结构化数据。文章详细讲解了MinIO在Java中的使用方法,包括添加依赖、初始化客户端、基本操作(创建桶、上传/下载/删除对象)和高级功能(设置桶策略、使用预签名URL),并提供了Spring Boot集成MinIO的示例。
1156 4
|
SQL 缓存 关系型数据库
MySQL常见问题解决和自动化安装脚本
这篇内容包含了两个主要部分:解决MySQL登录问题和处理GPG密钥问题。当MySQL密码正确但无法登录时,可以通过执行SQL命令`ALTER USER`和`flush privileges`来修改和重置密码。对于MySQL安装时的GPG密钥错误,首先需要强制删除旧的MySQL仓库包,导入新的GPG公钥,然后安装MySQL服务器。如果遇到GPG检查错误,可以使用`--nogpgcheck`参数忽略检查来安装。最后,提供了一个自动化安装MySQL的脚本,用于检查旧版本、卸载残留、安装MySQL8并启动服务。
1147 1
MySQL常见问题解决和自动化安装脚本
|
SQL 关系型数据库 数据库
AWS Database Migration Service (DMS)
AWS Database Migration Service (DMS)
576 3
|
网络协议 网络安全
listen()函数第二个参数的作用?
listen()函数第二个参数的作用?
289 1
|
JavaScript
Vue 脚手架中的.eslintrc.js代码规范 的解决
Vue 脚手架中的.eslintrc.js代码规范 的解决
Vue 脚手架中的.eslintrc.js代码规范 的解决