Typescript高级: 深入理解const和readonly

2024-05-09 12:20

本文主要是介绍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、优化性能等方面发挥着重要作用
  • 它们鼓励开发者采用更安全、更易于推理的编程模式,尤其是在团队协作和长期维护的项目中
  • 通过与其他语言特性的结合使用,如泛型、解构赋值等
  • 可以进一步提升代码的灵活性和表达力,构建出既强大又稳定的软件系统

这篇关于Typescript高级: 深入理解const和readonly的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/973405

相关文章

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

Java中的for循环高级用法

《Java中的for循环高级用法》本文系统解析Java中传统、增强型for循环、StreamAPI及并行流的实现原理与性能差异,并通过大量代码示例展示实际开发中的最佳实践,感兴趣的朋友一起看看吧... 目录前言一、基础篇:传统for循环1.1 标准语法结构1.2 典型应用场景二、进阶篇:增强型for循环2.

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

深入解析 Java Future 类及代码示例

《深入解析JavaFuture类及代码示例》JavaFuture是java.util.concurrent包中用于表示异步计算结果的核心接口,下面给大家介绍JavaFuture类及实例代码,感兴... 目录一、Future 类概述二、核心工作机制代码示例执行流程2. 状态机模型3. 核心方法解析行为总结:三

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

mysql中的group by高级用法详解

《mysql中的groupby高级用法详解》MySQL中的GROUPBY是数据聚合分析的核心功能,主要用于将结果集按指定列分组,并结合聚合函数进行统计计算,本文给大家介绍mysql中的groupby... 目录一、基本语法与核心功能二、基础用法示例1. 单列分组统计2. 多列组合分组3. 与WHERE结合使

PyTorch高级特性与性能优化方式

《PyTorch高级特性与性能优化方式》:本文主要介绍PyTorch高级特性与性能优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、自动化机制1.自动微分机制2.动态计算图二、性能优化1.内存管理2.GPU加速3.多GPU训练三、分布式训练1.分布式数据