在 TypeScript 中,条件类型和映射类型是强大的类型工具,它们允许开发者根据类型的条件和映射对象类型的属性来创建新的类型。下面是对这两种类型的详细解释和示例。
1. 条件类型
条件类型允许根据某些条件来选择类型。基本语法如下:
T extends U ? X : Y
T
是要检查的类型。U
是条件类型。- 如果
T
是U
的子类型,结果为X
,否则为Y
。
示例
type IsString<T> = T extends string ? "Yes" : "No";
// 使用条件类型
type A = IsString<string>; // "Yes"
type B = IsString<number>; // "No"
在这个例子中,IsString
是一个条件类型,它检查类型 T
是否为 string
,如果是,则返回 "Yes"
,否则返回 "No"
。
2. 映射类型
映射类型允许创建一个新类型,该类型的属性是基于现有类型的属性。基本语法如下:
{ [K in keyof T]: X }
T
是要映射的类型。K
是T
中的每个键。X
是为每个键创建的类型。
示例
type Person = {
name: string;
age: number;
};
// 映射类型,创建一个所有属性都是 string 类型的类型
type PersonStrings = {
[K in keyof Person]: string;
};
// 结果是:
// type PersonStrings = {
// name: string;
// age: string;
// }
在这个例子中,PersonStrings
是一个映射类型,它将 Person
类型的所有属性都映射为 string
类型。
结合使用条件类型和映射类型
可以将条件类型与映射类型结合使用,以创建更复杂的类型逻辑。
示例
type Person = {
name: string;
age: number;
isActive: boolean;
};
// 创建一个只包含字符串类型属性的映射类型
type StringProperties<T> = {
[K in keyof T]: T[K] extends string ? T[K] : never;
};
type PersonStringProps = StringProperties<Person>;
// 结果是:
// type PersonStringProps = {
// name: string;
// age: never;
// isActive: never;
// }
在这个例子中,StringProperties
是一个映射类型,它检查 T
的每个属性,如果属性是 string
,则保留该属性的类型,否则使用 never
。最终的 PersonStringProps
类型只保留了 name
属性。
总结
- 条件类型允许根据条件来选择不同的类型。
- 映射类型允许基于现有类型的属性创建新类型。
- 这两种类型结合使用,可以创建灵活且强大的类型系统,以适应复杂的类型需求。
来源:ChatGPT