推荐答案
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
。