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

TypeScript中UnionKeys的T extends T条件判断是否必要?

关于UnionKeys<T>中T extends T的作用

你说得没错,当T是unknown、any或never时,T extends T确实始终为真,第二个分支never永远不会触发,结果和直接写keyof T一致。但这个条件绝非多余,它的核心作用是触发TypeScript的分布式条件类型机制,专门用来处理T是联合类型的场景。

举个直观的例子对比

假设T是一个对象联合类型:

type TestType = {a: number} | {b: string};

直接用keyof T的结果

type DirectKeys = keyof TestType; // 结果是 never

这是因为联合类型的keyof会取所有成员键的交集,而{a: number}和{b: string}没有共同的键,所以结果是never,这显然不是我们想要的。

用T extends T ? keyof T : never的结果

type UnionKeys<T> = T extends T ? keyof T : never;
type DistributedKeys = UnionKeys<TestType>; // 结果是 "a" | "b"

这里T extends T触发了分布式条件类型:TypeScript会自动把联合类型拆成单个成员,分别计算每个成员的keyof,再把结果合并成新的联合类型——也就是所有成员键的并集,这才是这个工具类型的设计目标。

再验证你提到的特殊类型

  • 当T是unknown:UnionKeys<unknown>和keyof unknown一样,结果都是never。
  • 当T是any:UnionKeys<any>和keyof any一样,结果都是string | number | symbol。
  • 当T是never:UnionKeys<never>和keyof never一样,结果都是never。

只有当T是包含多个成员的联合类型时,T extends T的价值才会体现出来,它让工具类型能够正确遍历联合类型的每个成员,收集所有可能的键。

内容的提问来源于stack exchange,提问作者IcyBrk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:13:08