You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript能否从联合类型或交叉类型中提取随机元素?

从TypeScript联合类型中提取任意单个元素

可以实现从联合类型中提取任意单个元素,但要明确:TypeScript的联合类型本质是无序集合,提取结果依赖编译器的内部处理逻辑,无法做到真正的“随机”选择,但能得到联合类型中的某一个成员。

实现方案

利用条件类型的分布式特性和逆变推断,可以构造出这样的工具类型:

type ExtractAnyElement<T> = 
    (T extends any ? (x: T) => void : never) extends (x: infer U) => void 
        ? U 
        : never;

原理说明

  1. 先通过T extends any ? (x: T) => void : never将联合类型T转换为对应成员的函数类型联合(比如abc会变成(x: 'a') => void | (x: 'b') => void | (x: 'c') => void)。
  2. 再用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 04:46:09