如何自动提取嵌套对象二级键的联合类型(无需手动指定一级键)
提取嵌套JSON二级键的联合TypeScript类型
你拥有嵌套对象组成的JSON数据,希望无需手动指定一级键,提取所有二级键的唯一集合作为TypeScript联合类型。示例场景如下:
const json = { 'alice': { 'dogs': 1, 'birds': 4, }, 'bob': { 'dogs': 2, 'cats': 5, }, } // 手动指定一级键可得到目标联合类型 type animals1 = keyof typeof json['alice'] | keyof typeof json['bob'] // animals1 = 'dogs' | 'birds' | 'cats' // 自动尝试的写法仅返回所有二级键的交集 type people = keyof typeof json type animals3 = keyof typeof json[people] // animals3 = 'dogs'
可以通过分布式条件类型实现需求,利用TypeScript对联合类型的自动分发特性,逐个提取每个一级对象值的键并合并为联合类型:
// 工具类型:提取联合类型中每个成员的键 type KeysOfUnion<U> = U extends unknown ? keyof U : never; // 自动生成所有二级键的联合类型 type animals = KeysOfUnion<typeof json[keyof typeof json]>; // 最终结果:'dogs' | 'birds' | 'cats'
逻辑说明
typeof json[keyof typeof json]:先获取一级对象所有值的联合类型,即typeof json['alice'] | typeof json['bob']KeysOfUnion<U>:借助条件类型的分发特性,对联合类型U中的每个成员单独执行keyof U,最终将所有结果合并为一个完整的联合类型,而非取交集。
如果需要更简洁的封装,可以把逻辑整合为一个工具类型:
type AllSecondLevelKeys<T> = KeysOfUnion<T[keyof T]>; type animals = AllSecondLevelKeys<typeof json>;
内容的提问来源于stack exchange,提问作者Andrew Hows
相关产品推荐
相关产品推荐

