在TypeScript中,我们可以使用条件类型来实现类型之间的条件判断和类型映射。
- 条件类型
条件类型使用extends关键字来进行类型判断,并根据条件结果选择不同的类型。
// 定义一个条件类型
type ConditionType<T, U> = T extends U ? true : false;
// 使用条件类型
type Result1 = ConditionType<'foo', 'bar'>; // false
type Result2 = ConditionType<'bar', 'bar'>; // true
- 内置条件类型
TypeScript提供了一些内置的条件类型,如Exclude、Extract、Pick等。
// 使用Exclude内置条件类型
type ExcludeResult = Exclude<"a" | "b" | "c", "a">; // "b" | "c"
// 使用Extract内置条件类型
type ExtractResult = Extract<"a" | "b" | "c", "a" | "c">; // "a" | "c"
// 使用Pick内置条件类型
interface Person {
name: string;
age: number;
gender: string;
}
type PickResult = Pick<Person, "name" | "age">; // { name: string; age: number; }
- 分发条件类型
分发条件类型是指在处理联合类型时,可以对其成员逐一进行条件判断。
// 定义一个分发条件类型
type DistributeConditionType<T, U> = T extends U ? true : false;
// 使用分发条件类型
type Result1 = DistributeConditionType<('foo' | 'bar'), 'bar'>; // true | false
// 使用infer关键字进行模式匹配
type DistributeInferType<T> = T extends { a: infer U, b: infer U } ? U : never;
// 使用分发条件类型
type Result2 = DistributeInferType<{ a: 'foo', b: 'bar' }>; // 'foo' | 'bar'
- 关于内置条件类型的解释
- Exclude<T, U>:从T中排除可分配给U的类型。
- Extract<T, U>:提取T中可分配给U的类型。
- Pick<T, K>:从T中选择属性K类型。
- Record<K, T>:将K中的所有属性的类型设置为T。
- Partial<T>:将T中的所有属性设置为可选。
- Required<T>:将T中的所有属性设置为必需。
- Omit<T, K>:从T中删除属性K。
- ReturnType<T>:获取函数T的返回类型。
- 使用内置条件类型的例子
interface Person {
name: string;
age: number;
gender: string;
}
// 使用Exclude
type Excluded = Exclude<keyof Person, 'name'>; // 'age' | 'gender'
// 使用Extract
type Extracted = Extract<keyof Person, 'name' | 'age'>; // 'name' | 'age'
// 使用Pick
type Picked = Pick<Person, 'name'>; // { name: string }
// 使用Record
type Recorded = Record<'name' | 'age', string>; // { name: string; age: string; }
// 使用Partial
type PartialPerson = Partial<Person>; // { name?: string; age?: number; gender?: string; }
// 使用Required
type RequiredPerson = Required<PartialPerson>; // { name: string; age: number; gender: string; }
// 使用Omit
type O