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

如何实现TypeScript泛型以提取联合类型的第一个成员?

实现取联合类型第一个成员的泛型

你原来的写法无法生效,核心原因是T extends (infer FirstToken | any)不符合TypeScript的类型推断规则:infer只能在条件类型的extends子句中单独作为类型占位符使用,这种写法会触发条件类型的分发逻辑,最终FirstToken会被推断为联合的所有成员,返回结果还是原联合类型。

正确实现方式

可以利用函数参数的逆变特性来实现需求:

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

// 测试验证
type Case1 = F<'a' | 'b' | 'c'>; // 结果为 'a'
type Case2 = F<'alpha' | 'beta' | 'gamma' | 'delta'>; // 结果为 'alpha'

原理说明

  1. T extends any ? (x: T) => void : never:通过条件类型的分发机制,把联合类型的每个成员转换成对应的函数类型,形成函数类型的联合。比如'a'|'b'|'c'会被转换为((x: 'a') => void) | ((x: 'b') => void) | ((x: 'c') => void)。
  2. (...) extends (x: infer First) => void ? First : never:在函数参数这个逆变位置进行类型推断时,TypeScript会提取联合类型中第一个声明的成员作为First的推断结果,从而得到目标成员。

内容的提问来源于stack exchange,提问作者Mir-Ismaili

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 14:15:04