如何从TypeScript联合类型中过滤含非指定键的对象?
过滤联合类型中仅含指定键的成员
给定联合类型:
type Test = { name: "a" } | { name: "b" } | { name: "c", other: 1 } | { name: "d", other: 2 }
需要过滤掉所有包含name以外其他键的类型,最终得到{ name: "a" } | { name: "b" }。
解决方案
可以通过TypeScript条件类型结合键操作实现:
type OnlyHasName<T> = T extends { name: infer N } ? (Exclude<keyof T, "name"> extends never ? { name: N } : never) : never; // 应用到Test类型 type FilteredTest = OnlyHasName<Test>; // 类型为 { name: "a" } | { name: "b" }
原理说明
- 遍历联合成员:条件类型
T extends { name: infer N }会自动遍历联合类型的每个成员,提取name字段的类型到N; - 判断键的唯一性:
Exclude<keyof T, "name"> extends never用于检查当前类型T是否仅包含name这一个键——如果排除name后没有剩余键,说明符合要求; - 保留或排除:符合条件的类型保留为
{ name: N },不符合的返回never,而never在联合类型中会被自动忽略。
内容的提问来源于stack exchange,提问作者TLadd
相关产品推荐
相关产品推荐

