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