内置工具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 对象的任何属性。这有助于确保对象的属性在使用时不会被意外地省略,提高代码的可靠性和稳定性。

相关文章
|
3月前
|
开发框架 .NET 编译器
总结一下 C# 如何自定义特性 Attribute 并进行应用
总结一下 C# 如何自定义特性 Attribute 并进行应用
|
3月前
Flutter更改主题颜色报错:type ‘Color‘ is not a subtype of type ‘MaterialColor‘
Flutter更改主题颜色报错:type ‘Color‘ is not a subtype of type ‘MaterialColor‘
43 4
|
4月前
4. 解决uni-app开发过程中view、image等标签出现诸如“出现错误:类型“{ class: string; }”的参数不能赋给类型“.......”
4. 解决uni-app开发过程中view、image等标签出现诸如“出现错误:类型“{ class: string; }”的参数不能赋给类型“.......”
373 0
|
5月前
|
UED
简述a标签target属性的取值和作用
简述a标签target属性的取值和作用
48 0
|
编译器 程序员 C++
Qt之自定义属性Q_PROPERTY专题(1)充分理解其概念以及用途
Qt之自定义属性Q_PROPERTY专题(1)充分理解其概念以及用途
2473 0
Qt之自定义属性Q_PROPERTY专题(1)充分理解其概念以及用途
|
6月前
|
XML Java 数据格式
面试题:怎样把所有的组件的lazy-init值都设置为默认true?
面试题:怎样把所有的组件的lazy-init值都设置为默认true?
43 0
|
存储 数据挖掘 数据库
data的含义与作用及使用方法
data的含义与作用及使用方法
6404 0
ts重点学习37-可选属性和只读属性
ts重点学习37-可选属性和只读属性
74 0
ts重点学习37-可选属性和只读属性
ts重点学习38-可选属性和只读属性笔记
ts重点学习38-可选属性和只读属性笔记
138 0
iOS-底层原理 10:strong&copy&weak底层分析 以及 方法签名和attribute简写含义
iOS-底层原理 10:strong&copy&weak底层分析 以及 方法签名和attribute简写含义
166 0
iOS-底层原理 10:strong&copy&weak底层分析 以及 方法签名和attribute简写含义