Typescript高级: 深入理解const和readonly

深入理解TypeScript中的readonly修饰符 readonly修饰符在TypeScript中提供了一种简单而有效的方式来确保类属性的不可变性。它不仅有助于提高代码的安全性,还可以使代码更加清晰和易于维护。通过合理地使用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、优化性能等方面发挥着重要作用
  • 它们鼓励开发者采用更安全、更易于推理的编程模式,尤其是在团队协作和长期维护的项目中
  • 通过与其他语言特性的结合使用,如泛型、解构赋值等
  • 可以进一步提升代码的灵活性和表达力,构建出既强大又稳定的软件系统
TypeScript中的const断言:深入理解与实践 断言在TypeScript中是一个非常有用的工具,它可以帮助我们更精确地控制变量和对象的类型推断,特别是在处理常量和不可变数据时。断言是一种强大的类型工具,它可以帮助开发者更精确地定义变量的类型,并提供更好的类型推断和代码可读性。断言是TypeScript 3.4版本引入的特性,主要作用是将变量的类型推断为其字面量类型,同时使变量具有。通过这些实践,我们可以更好地利用TypeScript的类型系统,编写更安全、更可维护的代码。断言在原始类型上的应用及其在对象类型中的特殊表现。在TypeScript中, 阅读详情

相关推荐

带挂牵引车倒车运动模型推导及仿真实现

半挂牵引车在倒车时,由于鞍座主销的连接限制,其运动方式与乘用车有显著差异。例如,乘用车在右侧倒车入库时,只需确定泊车起点并将方向盘向右打死。相反,牵引车在倒车时需要先向左转方向盘,当铰接角达到防折叠的临界值时,再将方向盘向右转回,以调整牵引车与挂车至直线状态,完成泊车入库。本研究旨在建立一个基于牵引车带挂车倒车运动学模型,该模型基于以下假设: 道路在车辆行驶过程中保持平坦,无凹凸不平; 车辆以低速行驶,且在运行过程中车身不发生侧倾或俯仰; 行驶过程中,轮胎无变形,无侧向滑动,且不产

jianmo的博客 2697

TypeScript:const

使用const定义的变量与使用let定义的变量拥有相同的作用域,不同在于使用const定义的变量后续不能对他进行重新赋值: const a = 1; a = 2;//error TS2588: Cannot assign to 'a' because it is a constant. 但如果使用const定义的是object或数组类型的变量,变量本身不能被重新赋值,但变量所代表的对象或数组还是可以被修改的: const a = { data : 1 }; a.data = 2; console

风静如云的博客 3895

SimpleFOC STM32实战:基于F103与HAL库,剖析速度环与电流环的协同控制

本文详细介绍了基于STM32F103与HAL库的SimpleFOC实战应用,重点剖析速度闭环控制与电流环的协同工作原理。通过开发环境搭建、参数调试技巧及性能优化方案,帮助开发者高效实现无刷电机精准控制,适用于机器人、无人机等高精度应用场景。

weixin_29170327的博客 478

Typescript语法

⾯向对象编程(Object-Oriented Programming,简称OOP)是⼀种编程范式,其核⼼理念在于将程 序中的数据与操作数据的⽅法有机地组织成对象,从⽽使程序结构更加模块化和易于理解。类(class)是对象的蓝图或模板,它定义了对象的属性(数据)和⾏为(⽅法)。Typescript 中的类中可以包含静态成员(静态属性和静态⽅法),静态成员⾪属于类本⾝,⽽不属于某个对象实例。⼀个函数可能⽤于处理不同类型的值,这种情况可以使⽤联合类型,例如以下案例中的。,对象类型的变量可以通过对象字⾯量⸺。

weixin_74923758的博客 1082

Vue - 在纯 HTML 普通项目中实现组件化,让原生 html 项目支持引入 *.vue 组件 / 组件与组件间的互相引用等,完美解决了引入组件出现的跨域问题(保姆级详细教程,完整示例源码及插件)

html中使用vue组件,在HTML页面中引入vue组件,HTML界面利用http-vue-loader.js以组件方式引入vue文件,使用http-vue-loader引入组件出现报错,在html页面使用http-vue-loader插件引入组件报跨域错误,如何解决http-vue-loader引用组件时出现跨域问题,纯html原生web项目引入vue后如何实现组件引入,使用http-vue-loader插件控制台报错跨域,http-vue-loader跨域怎么办官方文档,html页面如何引入.vu

🏆 前端领域优质创作者 3909

从零开始学习PX4源码9(部署px4源码到gitee)

由于PX4-Autopilot托管在github,在没有翻墙的情况下,下载固件无法下载。为了提高下载速度,这里将PX4在github上的仓库以及其子仓库(依赖仓库)都搬移到gitee上了。本教程讲解如何快速部署px4固件到gitee上,实现不需要翻墙快速本地就可以下载PX4固件。暂时没有找到如何批量直接通过修改.gitmodules后,使用什么命令可以直接把所有的一级二级子模块的指向直接正常映射。!!

陌城烟雨 813

TypeScript中的`let`、`const`、`var`区别:变量声明的规范与实践

理解letconstvar的区别对于编写清晰、可维护的TypeScript代码至关重要。合理选择变量声明关键字,可以帮助避免作用域相关的问题,并提高代码的可读性和可维护性。

十一逐星的博客 2557

24届数字IC设计/验证秋招总结贴——先看这个

为方便快速进行查找该专栏的内容,将所有内容链接均放在此篇博客中整理不易,欢迎订阅~~

qq_42135020的博客 8416

typescript利用接口类型声明变量_TypeScript 变量声明

TypeScript变量声明let和const是JavaScript里相对较新的变量声明方式。 像我们之前提到过的,let在很多方面与var是相似的,但是可以帮助大家避免在JavaScript里常见一些问题。const是对let的一个增强,它能阻止对一个变量再次赋值。因为TypeScript是JavaScript的超集,所以它本身就支持let和const。 下面我们会详细说明这些新的...

weixin_39524147的博客 255

【OpenClaw从入门到精通】第02篇:5分钟速通!阿里云/华为云一键部署OpenClaw(附避坑指南·2026实测版)

本文聚焦OpenClaw的云端部署场景,针对本地部署“关机即离线、跨设备访问难”的痛点,详解阿里云(主推)和华为云(备选)的一键部署流程。2026实测验证:阿里云轻量应用服务器通过官方OpenClaw镜像可5分钟完成部署,华为云Flexus L实例需补充SSH配置步骤;文中拆解云端部署核心概念(地域选择、端口放行、成本构成),通过“AI助理定时抓取行业资讯并推送钉钉”的虚拟案例演示云端7×24小时运行价值,同时提供模型调用、服务器成本的精细化控制方案,梳理端口访问失败、API-Key权限异常等高频坑点的解决

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 5551

ZYNQ通过AXI DMA实现PL发送连续大量数据到PS DDR

方案二是在PS端的MPU配置中,将DMA缓冲区所在的内存区域标记为“不缓存”(Device或Strongly Ordered类型),但这样CPU访问这些内存区的速度会大幅降低,需要根据实时性和数据正确性的需求做权衡。更妙的是,描述符链表可以做成一个环状队列,放在DDR里让DMA循环取走,从而实现持续不断的“流式”传输。用FPGA实现FFT硬件加速的系统中也是如此:PS向PL提交待处理的FFT数据,PL硬件加速计算后,DMA把结果写回DDR,全程CPU几乎只做配置调度,大量数据吞吐留给了硬件通道。

QQ_778132974的博客 176

TypeScript中const与readonly的区别与应用解析

摘要 TypeScript中const与readonly均用于实现数据不可变性,但存在本质差异: 作用范围:const作用于变量,禁止重新赋值;readonly修饰对象属性,阻止属性修改。 类型推断:const声明会推断为字面量类型(如"hello"),readonly仅标记属性不可变。 应用场景:const适合全局常量与精确类型控制;readonly用于类/接口属性,确保初始化后不变。 关键点: const变量不可重新赋值,但对象属性仍可修改;readonly属性完全禁止修改。 结合a

你若盛开,清风自来 915

PyTorch深度学习项目实战100例数据集

最近很多订阅了的用户私信咨询有些数据集下载不了以及一些文章中没有给出数据集链接,为了解决这个问题,专门开设了本篇文章,提供数据集下载链接,打包100例的所有数据集。本专栏适用人群:深度学习初学者,专栏将具体讲解如何快速搭建深度学习模型用自己的数据集实现深度学习小项目。 本专栏整理了《PyTorch深度学习项目实战100例》,内包含了各种不同的深度学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。

优快云 精品推荐 2万+

TypeScript中const与引用类型的核心机制解析

在JavaScript和TypeScript中,const关键字用于声明不可重新赋值的变量,但其行为与引用类型的交互常引发误解。const实际上保证的是变量绑定的不可变性,而非值本身的不可变性,这与Java的final或C++的const有本质区别。理解这一原理对编写可靠的TypeScript代码至关重要,特别是在处理对象和数组等引用类型时。通过Object.freeze、Readonly类型等机制,开发者可以实现不同程度的不可变性控制,这在状态管理、配置对象等场景中具有重要工程价值。本文深入剖析TypeS

weixin_33724570的博客 386

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

The Concise TypeScript Book:深入理解固定长度元组(Fixed Length Tuple)

固定长度元组(Fixed Length Tuple)是 TypeScript 元组类型家族中最严格的一员:它在编译期强制约束元组的**元素数量**与**每个位置的元素类型**,并禁止一切改变元组长度的操作(如 `push`、`pop`)。本指南以 [The Concise TypeScript Book](https://link.gitcode.com/i/cd3564a80016a582a94

gitblog_00921的博客 822

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

深入理解 TypeScript 固定长度元组(Fixed Length Tuple):类型约束、const 断言与实战用法

固定长度元组(Fixed Length Tuple)是 TypeScript 元组体系中的一种特殊形态:它强制元组拥有**固定数量的元素**和**固定顺序的对应类型**,并且一旦定义,不允许对元组的长度做任何修改。本文以《The Concise TypeScript Book》中的 [fixed-length-tuple.md](https://link.gitcode.com/i/5e8d77a

gitblog_00392的博客 455

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

The Concise TypeScript Book 实战:深入理解 TypeScript 对象类型(Object Types)的定义与使用

对象类型(Object Types)是 TypeScript 类型系统的基石——它描述一个对象应有的"形状"(shape):包含哪些属性、每个属性的类型,以及这些属性是必需还是可选。本文以《The Concise TypeScript Book》的 [Types d'objets(对象类型)](https://link.gitcode.com/i/f6a1649b6943726387e09743a

gitblog_00779的博客 786

《The Concise TypeScript Book》精讲:TypeScript 映射类型修饰符(Mapped Type Modifiers)完全指南

映射类型(Mapped Types)允许我们基于既有类型逐属性生成新类型,而映射类型修饰符(Mapped Type Modifiers)则是在这个过程中控制每个属性"只读性"与"可选性"的关键语法。本文以开源仓库 typ/typescript-book 中 [mapped-type-modifiers.md](https://link.gitcode.com/i/e1daa9de83d7b8895

gitblog_00765的博客 856

The Concise TypeScript Book:深入理解字面量推断(Literal Inference)

字面量推断(Literal Inference)是 TypeScript 类型系统的基础特性:编译器会根据变量/参数的实际值,把类型推断为尽可能精确的字面量类型。本指南以《The Concise TypeScript Book》([葡萄牙语版章节](https://link.gitcode.com/i/956a5c0780d0e8c4ecd7130ea9d77287))为主线,系统讲解 `cons

gitblog_01025的博客 697

TypeScript 固定长度元组(Fixed Length Tuple)详解:The Concise TypeScript Book 中的长度约束与 `as const` 实战

本篇技术指南聚焦于《The Concise TypeScript Book》中「Fixed Length Tuple(固定长度元组)」这一章节,系统讲解如何在 TypeScript 中声明长度固定、元素类型固定的元组,并深入剖析 `as const` 断言禁止修改长度的底层机制。阅读本文后,你将掌握固定长度元组的三类声明方式(`as const`、显式元组类型注解、`readonly` 元组)、它

gitblog_00712的博客 243

C#中const与readonly的区别

const与readonly的区别: 1.const是常量,定义时就必须给予初始化值,同时值不可更改,默认是静态的. 2.readonly则可以在构造函数中给予赋值操作,所以后者在不同的构造函数中可以赋予不同的数值,默认不是静态的,如果要求是静态的必须标明static. ...

qq_26343241的博客 213

深入理解 TypeScript 可选属性(Optional Properties):语法、类型语义与实战模式——《The Concise TypeScript Book》精读

本篇文章以《The Concise TypeScript Book》开源仓库([英文原版文档](https://link.gitcode.com/i/dee7922ba8b34537c3ffe6b78b878e4a),[法文版文档](https://link.gitcode.com/i/1d4566ec0bd45b12d6fbb55f50be4fc8))中"Optional Properties(

gitblog_01103的博客 770

The Concise TypeScript Book 精讲:深入理解 TypeScript 字面量推断(Literal Inference)与 `as const` 约束

字面量推断(Literal Inference)是 TypeScript 类型系统的一项基础特性:编译器会根据变量的**值**而非显式标注,推断出变量或参数的类型。它决定了 `const` 变量可以精确到单个字面量(如 `'x'`),而 `let` 变量与对象属性往往被拓宽为宽泛类型(如 `string`)——这正是许多「类型不兼容」报错的根源。本文以 [The Concise TypeScrip

gitblog_00716的博客 60

TypeScript 固定长度元组(Fixed Length Tuple)实战指南:用 `as const` 锁定长度与类型

固定长度元组是 TypeScript 中一类特殊的元组类型:它在编译期强制规定元素个数与每个位置的元素类型,并在定义之后不允许任何改变元组长度的操作。本文以《The Concise TypeScript Book》第 31 章(德语版 [fixed-length-tuple.md](https://link.gitcode.com/i/fb97598f0426e73c7ffe2338a5a2df8

gitblog_00217的博客 718

Learn X in Y minutes 中文版:TypeScript 核心语法快速指南(JavaScript 超集实战)

TypeScript 是一门为开发大型 JavaScript 应用而设计的语言,它在 JavaScript 的基础上增加了类、模块、接口、泛型与(可选的)静态类型等概念,是 JavaScript 的严格超集。本文以本仓库 [zh-cn/typescript.md](https://link.gitcode.com/i/588df226c807e0b2d1beaf09005db1aa) 为骨架,只聚

gitblog_00994的博客 125

TypeScript接口_typescript `name`的类型与索引类型返回值的类型不匹配

也就是说你遇到了额外类型检查出的错误,你应该去审查一下你的类型声明。当你操作类和接口的时候,你要知道类是具有两个类型的:静态部分的类型和实例的类型。可以同时使用两种类型的索引,但是数字索引的返回值必须是字符串索引返回值类型的子类型。然而,最佳的方式是能够添加一个字符串索引签名,前提是你能够确定这个对象可能具有某些做为特殊用途使用的额外属性。对于函数类型的类型检查来说,函数的参数名不需要与接口里定义的名字相匹配。可索引类型具有一个 索引签名,它描述了对象索引的类型,还有相应的索引返回值类型。

2401_86372349的博客 1096
上一篇: Typescript高级: 深入理解断言
下一篇: Typescript高级: 深入理解 keyof, extends 以及 extends keyof
Wang's Blog
博客等级 码龄12年 7433粉丝 2420原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值