条件类型是用 条件表达式 进行类型的关系检测
简单的值匹配
type Equal<X, Y> = X extends Y ? true : false;
type Num = Equal<1,1>; // true
type Str = Equal<'a','a'>; // true
type Boo = Equal<true, false>; // false
嵌套类型匹配
type TypeName<T> =
T extends string ? "string" :
T extends number ? "number" :
T extends boolean ? "boolean" :
T extends undefined ? "undefined" :
T extends Function ? "function" :
"object";
type T0 = TypeName<string>; // "string"
type T1 = TypeName<"a">; // "string"
type T2 = TypeName<true>; // "boolean"
type T3 = TypeName<() => void>; // "function"
type T4 = TypeName<string[]>; // "object"
联合类型判断
type A = 'x';
type B = 'x' | 'y';
type Y = A extends B ? true : false; // true
联合类型无法做出判断
得到一个联合类型,包含所有返回值
type AB<T> = T extends 'x' ? 'a' : 'b';
type All = AB<'x'|'y'>; // 非确定条件
// 得到 type All = 'a' | 'b';
栗子:一个过滤功能的函数类型
type Filter<T, U> = T extends U ? never : T;
type Values = Filter<'x'|'y'|'z', 'x'>; // Values = 'y' | 'z'