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
相关产品推荐
相关产品推荐

