内置工具Readonly,Required 的源码形状并说明其作用

简介: 内置工具Readonly,Required 的源码形状并说明其作用

Readonly 是 TypeScript 中的一个工具类型,它用于将给定类型的所有属性设置为只读。下面是 Readonly 的源码形状和作用的说明:

type Readonly<T> = {
    readonly [P in keyof T]: T[P];
};
  • Readonly<T> 表示一个新的只读类型,它接受一个泛型参数 T,表示要转换为只读的类型。
  • [P in keyof T] 是一个映射类型(Mapped Type),它遍历 T 的每个属性,并创建一个新的只读属性。
  • readonly 关键字用于声明属性为只读,这意味着无法对该属性进行修改。
  • T[P] 表示属性 P 在原始类型 T 中的类型。

例如,如果我们使用 Readonly 将一个对象的所有属性变为只读:

interface Person {
    name: string;
    age: number;
}
const readonlyPerson: Readonly<Person> = {
    name: "Alice",
    age: 25,
};
readonlyPerson.name = "Bob"; // 错误,无法对只读属性进行修改
readonlyPerson.age = 30; // 错误,无法对只读属性进行修改

在上述示例中,Readonly<Person>Person 类型的所有属性都变为了只读,因此无法对 readonlyPerson 对象的属性进行修改。这有助于确保对象的不可变性,避免在代码中意外地修改只读属性。

Required 是 TypeScript 中的一个工具类型,它用于将给定类型的所有属性设置为必需(非可选)。下面是 Required 的源码形状和作用的说明:

type Required<T> = {
    [P in keyof T]-?: T[P];
};
  • Required<T> 表示一个新的必需类型,它接受一个泛型参数 T,表示要转换为必需属性的类型。
  • [P in keyof T] 是一个映射类型(Mapped Type),它遍历 T 的每个属性,并创建一个新的必需属性。
  • -? 操作符用于将属性从可选变为必需。它会移除属性的可选性修饰符 ?

例如,如果我们使用 Required 将一个对象的所有属性设置为必需:

interface Person {
    name?: string;
    age?: number;
}
const requiredPerson: Required<Person> = {
    name: "Alice",
    age: 25,
};
requiredPerson.name = "Bob"; // 正确,必需属性无法省略
requiredPerson.age = 30; // 正确,必需属性无法省略

在上述示例中,Required<Person>Person 类型的所有属性都设置为必需属性,因此无法省略 requiredPerson 对象的任何属性。这有助于确保对象的属性在使用时不会被意外地省略,提高代码的可靠性和稳定性。

相关文章
|
机器学习/深度学习 算法 计算机视觉
使用深度学习进行图像识别
在当今技术飞速发展的时代,深度学习已经成为计算机视觉领域中最具前景和有影响力的技术之一。它的应用范围广泛,尤其在图像识别方面表现出色。本文将介绍使用深度学习进行图像识别的基本原理和步骤。
249 0
|
域名解析 JavaScript 网络协议
Vue框架中根据域名获取租户ID的方法
通过上述方法,Vue应用可以根据域名动态获取租户ID,进而实现根据不同租户展示定制化信息的多租户系统功能。这种技术不仅增加了应用的灵活性,也提升了用户体验。
343 2
|
数据采集 存储 算法
数据分享|Weka数据挖掘Apriori关联规则算法分析用户网购数据
数据分享|Weka数据挖掘Apriori关联规则算法分析用户网购数据
|
分布式计算 Hadoop 关系型数据库
Hadoop学习笔记(HDP)-Part.10 创建集群
本文为HDP集群部署系列第十篇,详细介绍通过Ambari创建集群的完整流程,包括版本选择、节点配置、服务安装及ZooKeeper核心参数解析,涵盖常用命令与典型问题处理,助力高效搭建稳定大数据环境。
470 0
|
Java Spring
springboot自带的@Scheduled注解开启定时任务
springboot自带的@Scheduled注解开启定时任务
471 0
|
Java 数据库连接 开发者
Java中的异常处理:不仅仅是try-catch
【9月更文挑战第21天】在Java的世界里,异常处理是代码的守护神,它确保我们的程序在遇到不可预见的错误时不会崩溃。但你知道吗?异常处理不仅仅是try-catch那么简单。本文将深入探讨Java异常处理的机制,包括自定义异常、finally块的重要性,以及如何优雅地处理异常链。让我们一起揭开异常处理的神秘面纱,学会更高效、更专业的异常管理技巧。
|
存储 JavaScript 前端开发
JavaScript 数组方法详解
JavaScript 数组方法详解
533 2
|
消息中间件 存储 NoSQL
【实战】使用Lua脚本怎么清理redis中的数据【实战】使用Lua脚本怎么清理redis中的数据
首先我们通过hiredis 向redis 中写入了数据,这里我们主要以测试为目的,所以,Key 值设定为毫秒级时间戳。
264 0
|
存储 固态存储 大数据
阿里云服务器收费价格表,云服务器实例、块存储、带宽等项目收费标准参考
阿里云服务器收费项目包括实例价格、预留实例券、专有宿主机、块存储价格、存储容量单位包、带宽价格和快照服务价格,收费模式既有包年包月也有按量付费模式,本文为大家汇总了这些项目的最新收费标准,以供参考。
1177 0
阿里云服务器收费价格表,云服务器实例、块存储、带宽等项目收费标准参考
|
SQL 数据库 HIVE
python链接hive数据库实现增删改查操作
python链接hive数据库实现增删改查操作
660 0