Skip to content

条件类型

泛型工具都依赖与条件类型的实现

基本语法

**条件类型(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