推荐答案
映射类型(Mapped Types)是 TypeScript 中一种强大的工具,允许你基于现有类型创建新的类型。通过映射类型,你可以对现有类型的属性进行转换、添加或删除,从而生成新的类型。常见的应用场景包括:
- 属性可选化:将对象类型的所有属性变为可选。
- 属性只读化:将对象类型的所有属性变为只读。
- 属性类型转换:将对象类型的属性类型从一种类型转换为另一种类型。
- 属性筛选:根据条件筛选对象类型的属性。
本题详细解读
1. 属性可选化
通过 Partial<T> 映射类型,可以将对象类型 T 的所有属性变为可选。这在处理部分更新对象时非常有用。
// www.javascriptcn.com code example
interface User {
name: string;
age: number;
}
type PartialUser = Partial<User>;
// PartialUser 等同于:
// {
// name?: string;
// age?: number;
// }2. 属性只读化
通过 Readonly<T> 映射类型,可以将对象类型 T 的所有属性变为只读。这可以防止对象在创建后被修改。
// www.javascriptcn.com code example
interface User {
name: string;
age: number;
}
type ReadonlyUser = Readonly<User>;
// ReadonlyUser 等同于:
// {
// readonly name: string;
// readonly age: number;
// }3. 属性类型转换
通过自定义映射类型,可以将对象类型的属性类型从一种类型转换为另一种类型。例如,将所有属性类型转换为 boolean。
// www.javascriptcn.com code example
type Booleanify<T> = {
[P in keyof T]: boolean;
};
interface User {
name: string;
age: number;
}
type BooleanUser = Booleanify<User>;
// BooleanUser 等同于:
// {
// name: boolean;
// age: boolean;
// }4. 属性筛选
通过条件类型和映射类型的结合,可以根据条件筛选对象类型的属性。例如,筛选出所有 string 类型的属性。
// www.javascriptcn.com code example
type StringKeys<T> = {
[P in keyof T]: T[P] extends string ? P : never;
}[keyof T];
interface User {
name: string;
age: number;
email: string;
}
type UserStringKeys = StringKeys<User>;
// UserStringKeys 等同于:
// "name" | "email"映射类型在 TypeScript 中提供了极大的灵活性,使得类型定义更加动态和可复用。