如何在TypeScript中提取联合类型的首个类型
提取联合类型的首个成员
首先得明确一点:TypeScript的联合类型本身是无序的,官方文档并没有把联合类型的定义顺序作为类型系统的一部分来保证。不过在当前的编译器实现中,联合类型的定义顺序是会被保留的,所以我们可以利用这个特性来实现你要的需求。
下面是具体的类型实现:
// 提取联合类型的第一个成员(依赖编译器对联合顺序的保留) type FirstOfUnion<U> = (U extends any ? (() => U) => void : never) extends (() => infer F) => void ? F : never; // 用你的例子测试 type T1 = "Hello" | "World"; type T2 = FirstOfUnion<T1>; // T2 会被推断为 "Hello"
原理说明
- 分发式条件类型:
U extends any ? (() => U) => void : never这部分会把联合类型的每个成员单独拿出来处理,生成一个函数类型的联合。比如你的"Hello" | "World"会被转换成(() => "Hello") => void | (() => "World") => void。 - 协变推断:接下来我们把这个联合函数类型去匹配
(() => infer F) => void,由于函数的返回值类型是协变的,TypeScript会推断出最具体的那个类型——也就是联合类型里第一个被定义的成员,最终得到你想要的"Hello"。
注意事项
- 这个方法依赖于编译器对联合顺序的保留,这不属于官方规范,未来版本的TypeScript可能会改变这个行为,所以使用时要留意。
- 如果联合类型里包含
never,这个方法可能会出现预期外的结果,因为never在分发式条件类型中会被自动忽略。
内容的提问来源于stack exchange,提问作者redsun
相关产品推荐
相关产品推荐

