如何获取TypeScript联合类型的所有可用键?
获取TypeScript联合类型的所有键
我完全懂你的困扰——当你尝试用keyof直接拿联合类型的所有键时,结果居然是never,明明你想要的是'foo' | 'bar',而且你不想靠重复写交叉类型来绕开这个问题。
为什么keyof Batz会得到never?
这是TypeScript的设计逻辑:keyof作用于联合类型时,只会返回所有联合成员共有的键。你的Foo和Bar没有共同属性,所以结果自然是never。你提到的keyof (Foo & Bar)能得到正确结果,是因为交叉类型会合并所有成员的键,但重复写类型确实不够优雅。
解决方案:用分布式条件类型提取所有键
我们可以写一个通用的类型工具,利用TypeScript的分布式条件类型特性,自动遍历联合类型的每个成员并提取它们的键,最后合并成联合结果:
// 通用类型工具:提取联合类型的所有键 type KeysOfUnion<T> = T extends unknown ? keyof T : never;
用你的例子测试一下:
interface Foo { foo: string; } interface Bar { bar: string; } type Batz = Foo | Bar; type AvailableKeys = KeysOfUnion<Batz>; // 结果是 'foo' | 'bar',完全符合你的预期!
原理说明
当T是联合类型时,分布式条件类型会自动把联合拆分成单个成员,分别代入keyof T计算,最后把所有结果重新合并成联合类型。这里用T extends unknown只是触发分布式的小技巧(unknown是所有类型的父类型,任何类型都满足这个条件)。如果你想更直观一点,也可以写成T extends T,效果完全一致——只要条件类型的左侧是裸类型参数(没被包裹在数组、对象等结构里),就会触发分布式行为。
内容的提问来源于stack exchange,提问作者Xenya
相关产品推荐
相关产品推荐

