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

如何获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:33:59