推荐答案
Extract<T, U> 是 TypeScript 中的一个实用工具类型,用于从类型 T 中提取出可以赋值给类型 U 的类型。换句话说,Extract<T, U> 会返回 T 中与 U 兼容的类型。
示例
type T = string | number | boolean; type U = string | boolean; type Result = Extract<T, U>; // Result 的类型为 string | boolean
在这个例子中,Extract<T, U> 从 T 中提取出了与 U 兼容的类型 string 和 boolean,因此 Result 的类型为 string | boolean。
本题详细解读
实现原理
Extract<T, U> 的实现原理是基于 TypeScript 的条件类型(Conditional Types)。它的定义如下:
type Extract<T, U> = T extends U ? T : never;
T extends U:这是一个条件类型表达式,表示如果T可以赋值给U,则返回T,否则返回never。never:表示一个永远不会出现的类型,通常用于表示不可能的情况。
工作过程
- 类型检查:TypeScript 会检查
T中的每一个类型是否可以赋值给U。 - 类型筛选:如果
T中的某个类型可以赋值给U,则保留该类型;否则,丢弃该类型(返回never)。 - 结果生成:最终,
Extract<T, U>会返回所有可以赋值给U的类型组成的联合类型。
示例解析
type T = string | number | boolean; type U = string | boolean; type Result = Extract<T, U>; // Result 的类型为 string | boolean
string可以赋值给U,因此保留。number不能赋值给U,因此被丢弃(返回never)。boolean可以赋值给U,因此保留。
最终,Result 的类型为 string | boolean。