条件类型
泛型工具都依赖与条件类型的实现
基本语法
**条件类型(Conditional Types)**是一种根据条件(类型约束)动态推导结果类型的语法。它的形式类似于三元运算符
ts
const Type=T extends U ? X : Y- 如果 T 能赋值给 U,Type类型就是 X;
- 否则Type类型就是 Y。
泛型中的条件类型
条件类型通常配合泛型使用,可以做动态的类型推导。
ts
type IsString<T> = T extends string ? "yes" : "no"
type T1 = IsString<string> // "yes"
type T2 = IsString<number> // "no"分布式条件类型
当条件类型作用于一个裸类型参数(即未被包裹的泛型参数)且该参数为联合类型时,TypeScript 会自动将联合类型的每个成员分别代入条件类型中进行计算,然后将结果合并为一个新的联合类型。这种行为称为分布式条件类型。
ts
type ToArray<T> = T extends any ? T[] : never;
type R = ToArray<string | number>;
// 分布式处理:
// ToArray<string> | ToArray<number>
// => string[] | number[]ts
type OnlyString<T> = T extends string ? T : never;
type R = OnlyString<string | number | boolean>; // string在 分布式条件类型 中,是否“分布式”只取决于第一个类型参数是否是“裸类型参数”,第二个参数不管是什么类型都不会触发分布式行为。
ts
type Foo<T, U> = T extends U ? T : never;
type R = Foo<string | number, string>;
// 分布式处理 T:
// string extends string ? string : never → string
// number extends string ? number : never → never
// 结果:string | never → string