Typescript高级: 深入理解const和readonly

概述

  • 在编程语言中,const 和 readonly 是两种用于声明常量或只读属性的关键字
  • 它们帮助开发者确保数据的不可变性,从而提高代码的安全性和可维护性
  • 虽然这两个概念在不同的编程语言中可能有所差异
  • 但本文将以 TypeScript 为例,深入探讨 const 和 readonly 的使用场景

const 关键字

  • 在 TypeScript(以及JavaScript ES6之后的版本)中
  • const 关键字用于声明一个常量变量,其值在初始化后不能被重新赋值
  • 这意味着一旦给 const 变量赋予了一个初始值,这个值就不能改变
  • 例如,const pi = 3.14; 声明了一个名为 pi 的常量,尝试修改 pi 的值会引发编译错误
  • 一般示例
const arr = [10, 30, 40, "abc"];
// arr = [100, 30, 40, "abc"]; // 错误:不能给常量赋新值

const arr2 = [10, 30, 40, "abc"] as const; // 使用 as const 使数组元素变为 readonly
// arr2[0] = 100; // 错误:无法修改只读元素
  • 需要注意的是,对于数组或对象这样的复杂数据类型
  • const 只保证引用不变,数组或对象内部的元素仍然可以被修改
  • 除非这些元素本身也是通过 const 或 readonly 声明的
  • 对于对象和数组,const 保证的是引用的不可变,而非内部结构的冻结
  • 使用 Object.freeze() 可以进一步使对象完全不可变
    const frozenObj = Object.freeze({ key: 'value' }); // 对象及其属性均不可变
    
  • 解构赋值与const:利用解构赋值,可以从 const 数组或对象中提取值
  • 即使原始数据不可变,仍能灵活操作提取出的数据
    const [a, b] = [10, 20] as const; // a 和 b 都是常量
    

readonly 关键字

  • readonly 是 TypeScript 提供的一个修饰符,用于标记类的属性或接口的成员为只读

  • 与 const 不同,它不仅适用于基本类型,还能确保数组或对象的结构不会被改变

  • 即不能添加、删除或修改元素(对于对象,则是不能修改其属性值)

    interface ReadonlyArray<T> {
      readonly [index: number]: T;
    }
    function showArr(arr: readonly any[]) {
      // arr[0] = 100; // 错误:试图修改只读数组元素
      console.log(arr);
    }
    
    
  • TypeScript 引入了 readonly 关键字,它主要用于类的属性和接口成员

  • 以声明这些属性或成员只能被读取,而不能被赋值或修改

  • 这对于设计具有不变性特性的类和接口非常有用,尤其是在构建复杂的数据模型时

    class Person {
        public name: string;
        readonly birthDate: Date;
    
        constructor(name: string, birthDate: Date) {
            this.name = name;
            this.birthDate = birthDate;
        }
    }
    
  • 泛型与readonly:结合泛型,可以创建通用的只读集合类型,增加代码的复用性和类型安全性

    function createReadOnlyArray<T>(items: T[]): readonly T[] {
        return Object.freeze(items);
    }
    

const 与 readonly 的区别

1 ) 作用域不同

  • const 主要用于变量声明
  • 而 readonly 用于类的属性或接口的定义中,提供更细粒度的控制。

2 ) 修改限制

  • const 确保变量引用不可变,但不阻止数组或对象内容的修改(除非使用 as const 转换)
  • readonly 则直接限制了数组或对象结构的任何变更。

3 ) 应用场景

  • const 适合于那些一旦赋值就不应更改的基本类型或复杂类型的引用
  • readonly 则在设计类和接口时,用来定义那些对外只暴露读取接口
  • 内部可以修改(通过构造函数或方法)的属性

总结

  • const 和 readonly 作为不变性编程的核心概念
  • 在保证代码质量、减少bug、优化性能等方面发挥着重要作用
  • 它们鼓励开发者采用更安全、更易于推理的编程模式,尤其是在团队协作和长期维护的项目中
  • 通过与其他语言特性的结合使用,如泛型、解构赋值等
  • 可以进一步提升代码的灵活性和表达力,构建出既强大又稳定的软件系统

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/604874.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读】 ICCV-2021-3D Local Convolutional Neural Networks for Gait Recognition

motivation :现有方法方法无法准确定位身体部位&#xff0c;不同的身体部位可以出现在同一个条纹(如手臂和躯干)&#xff0c;一个部分可以出现在不同帧(如手)的不同条纹上。其次&#xff0c;不同的身体部位具有不同的尺度&#xff0c;即使是不同帧中的同一部分也可以出现在不同…

【光速上手 Hydra 】一行代码自动跑多次实验,Hydra 中的 Multirun 参数如何使用?

Hydra 是一个开源的 Python 框架&#xff0c;简化了研究和其他复杂应用的开发。其关键特性是能够通过组合动态地创建一个分层次的配置&#xff0c;并通过配置文件和命令行进行覆盖。Hydra 的名称来源于其能够运行多个类似的作业 - 就像一个有多个头的九头蛇一样。 主要特性&am…

泽众财务RPA机器人常见五个应用场景

泽众RPA&#xff08;即机器人流程自动化&#xff0c;Robotic Process Automation, RPA&#xff09;解决方案是依托于各类先进信息技术手段的虚拟劳动力 &#xff08;数字劳动力&#xff09;&#xff0c;根据预先设定的程序操作指令对任务进行自动化处理&#xff0c;实现业务流程…

解锁机械之美:发动机设备拆解可视化揭秘

在现代工程技术的世界里&#xff0c;发动机作为机械设备的心脏&#xff0c;始终扮演着至关重要的角色。图扑的发动机设备拆解可视化技术&#xff0c;以其独特的视角和精确的细节&#xff0c;为我们开启了一扇了解复杂机械结构的新窗。通过高清晰度的三维图像和动画&#xff0c;…

在阿里云K8S容器中,部署websocket应用程序的总结

一、背景 有一个websocket应用程序&#xff0c;使用spring boot框架开发&#xff0c;http端口号是6005&#xff0c;提供的是websocket服务&#xff0c;所以它还监听一个8889端口的tcp协议。 现在要把它部署到阿里云的k8s容器里&#xff0c;本文着重描述service层的配置。 因…

鸿蒙开发接口Ability框架:【 (ServiceExtensionAbility)】

ServiceExtensionAbility ServiceExtensionAbility模块提供ServiceExtension服务扩展相关接口的能力。 说明&#xff1a; 本模块首批接口从API version 9开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 本模块接口仅可在Stage模型下使用。 导入…

【linux软件基础知识】-死锁问题

死锁问题 当两个或多个线程由于每个线程都在等待另一个线程持有的资源而无法继续时,就会发生死锁 如下图所示, 在线程 1 中,代码持有了 L1 上的锁,然后尝试获取 L2 上的锁。 在线程 2 中,代码持有了 L2 上的锁,然后尝试获取 L1 上的锁。 在这种情况下,线程 1 已获取 L…

减速机齿数速算

1.齿轮相关参数 1.1 模数 &#xff0c; 因为 齿数*齿距 Pi*直径 所以&#xff1a;直径/齿数 齿距/PI 模数 国标现行标准&#xff08;截止2024/5&#xff09;是&#xff1a; GB/ 1357-2008 / ISO 54-1996 模数有国标的一个序列标准&#xff1a; 1.2.轴径 轴径的国标是&a…

【测试报告】星光日册

⭐ 作者&#xff1a;Jwenen &#x1f331; 作者主页&#xff1a;Jwenen的个人主页 &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 测试报告 1. 项目介绍2. 测试用例框架3. 自动化测试源码 1. 项目介绍 “星光日册”项目实现了用…

追踪攻击数据包中的真实IP地址:方法与技巧

在网络安全领域&#xff0c;追踪攻击数据包中的真实IP地址是一项至关重要的任务。通过确定攻击者的真实IP地址&#xff0c;可以有效地识别和阻止网络攻击行为&#xff0c;提高网络安全防御水平。IP数据云IP地址查询将介绍几种常用的方法和技巧&#xff0c;帮助安全人员有效追踪…

【Linux】CAN根据时钟频率、波特率计算采样点详解

1、采样点知识回顾 参考博客:【CAN】知识点:帧类型、数据帧结构、传输速率、位时间、采样点 CAN 采样点是指在一个数据位的传输周期内,接收器实际采样数据的时间点。这个时间点是以百分比来表示的,它决定了在数据位的传输周期中,何时读取数据位的值。 正确设置采样点对…

60*13薪,外包到新疆...去吗?

大家好&#xff0c;我是白露呀。 今天我在牛客上看到一篇帖子&#xff0c;一位网友说自己收到一个 offer &#xff0c;薪资很高&#xff1a;60k*13&#xff0c;大约一年有近80万。 但是有个要求是外包到新疆的乌鲁木齐&#xff0c;他拿不定主意&#xff0c;就在牛客上发了这个…

华为数据之道第三部分导读

目录 导读 第三部分 第7章 打造“数字孪生”的数据全量感知能力 “全量、无接触”的数据感知能力框架 数据感知能力的需求起源&#xff1a;数字孪生 数据感知能力架构 基于物理世界的“硬感知”能力 “硬感知”能力的分类 “硬感知”能力在华为的实践 基于数字世界的…

Options API:选项式 API改成Composition API:组合式 API的留言板

让我欢喜让我忧 改成Composition API:组合式 API的代码&#xff0c; <template><!-- start --><span class"span_checkbox">操作<input type"checkbox" v-model"showInput" value"操作" /></span><…

VueReal将在Display Week上推出microLED创新技术

公司展示将microLED从晶圆转移到背板的“改变游戏规则”的平台 在2024年显示周&#xff08;5月12日至16日在圣何塞举行&#xff09;上&#xff0c;VueReal将展示其MicroSolid打印平台&#xff0c;并展示其在推动微LED显示器和其他微型半导体器件在智能手机显示器和AR/VR解决方案…

探索鸿蒙开发:鸿蒙系统如何引领嵌入式技术革新

嵌入式技术已经成为现代社会不可或缺的一部分。而在这个领域&#xff0c;华为凭借其自主研发的鸿蒙操作系统&#xff0c;正悄然引领着一场技术革新的浪潮。本文将探讨鸿蒙开发的特点、优势以及其对嵌入式技术发展的深远影响。 鸿蒙操作系统的特点 鸿蒙&#xff0c;作为华为推…

贪心算法-----柠檬水找零

今日题目&#xff1a;leetcode860 题目链接&#xff1a;点击跳转题目 分析&#xff1a; 顾客只会给三种面值&#xff1a;5、10、20&#xff0c;先分类讨论 当收到5美元时&#xff1a;不用找零&#xff0c;面值5张数1当收到10美元时&#xff1a;找零5美元&#xff0c;面值5张数…

jmeter控制器讲解

1&#xff0c;随机顺序控制器和随机控制器的区别&#xff1a;随机顺序控制器下所有的接口都会执行&#xff0c;只是执行顺序是随机的&#xff0c;随机控制器下所有的接口中随机执行一个接口&#xff0c;其余接口不执行。

C++之大数运算

溪云初起日沉阁 山雨欲来风满楼 契子✨ 我们知道数据类型皆有范围&#xff0c;一旦超出了这个范围就会造成溢出问题 今天说说我们常见的数据类型范围&#xff1a; 我们平时写代码也会遇到数据类型范围溢出问题&#xff1a; 比如 ~ 我们之前写的学生管理系统在用 int类型 填写…

学习笔记:IEEE 1003.13-2003(POSIX实时与嵌入式规范)

一、文档 在线参考&#xff1a; IEEE 1003.13-2003 免费下载Draft 版本&#xff08;pdf&#xff09;&#xff1a;IEEE Std. 1003.13 二、概念 1、POSIX标准 可移植操作系统接口&#xff08;英语&#xff1a;Portable Operating System Interface&#xff0c;缩写为POSIX&a…
最新文章