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