TypeScript能否从联合类型或交叉类型中提取随机元素?
从TypeScript联合类型中提取任意单个元素
可以实现从联合类型中提取任意单个元素,但要明确:TypeScript的联合类型本质是无序集合,提取结果依赖编译器的内部处理逻辑,无法做到真正的“随机”选择,但能得到联合类型中的某一个成员。
实现方案
利用条件类型的分布式特性和逆变推断,可以构造出这样的工具类型:
type ExtractAnyElement<T> = (T extends any ? (x: T) => void : never) extends (x: infer U) => void ? U : never;
原理说明
- 先通过
T extends any ? (x: T) => void : never将联合类型T转换为对应成员的函数类型联合(比如abc会变成(x: 'a') => void | (x: 'b') => void | (x: 'c') => void)。 - 再用
infer U提取函数参数的类型,由于函数类型的逆变特性,编译器会从联合的函数类型中推导并返回某一个成员类型(具体是哪个取决于编译器内部顺序)。
使用示例
type abc = 'a' | 'b' | 'c'; let testType: ExtractAnyElement<abc>; // 类型为'a'、'b'或'c'中的任意一个
补充:提取特定元素
如果需要明确提取某一个已知的元素,可以直接用TypeScript内置的Extract工具类型,或者自定义更直观的类型:
// 内置工具类型 type ExtractedB = Extract<abc, 'b'>; // 类型为'b' // 自定义类型 type ExtractSpecific<T, U extends T> = U; type ExtractedA = ExtractSpecific<abc, 'a'>; // 类型为'a'
内容的提问来源于stack exchange,提问作者rplaurindo
相关产品推荐
相关产品推荐

