如何实现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'
原理说明
T extends any ? (x: T) => void : never:通过条件类型的分发机制,把联合类型的每个成员转换成对应的函数类型,形成函数类型的联合。比如'a'|'b'|'c'会被转换为((x: 'a') => void) | ((x: 'b') => void) | ((x: 'c') => void)。(...) extends (x: infer First) => void ? First : never:在函数参数这个逆变位置进行类型推断时,TypeScript会提取联合类型中第一个声明的成员作为First的推断结果,从而得到目标成员。
内容的提问来源于stack exchange,提问作者Mir-Ismaili
相关产品推荐
相关产品推荐

