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

如何自动提取嵌套对象二级键的联合类型(无需手动指定一级键)

提取嵌套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'

逻辑说明

  1. typeof json[keyof typeof json]:先获取一级对象所有值的联合类型,即typeof json['alice'] | typeof json['bob']
  2. KeysOfUnion<U>:借助条件类型的分发特性,对联合类型U中的每个成员单独执行keyof U,最终将所有结果合并为一个完整的联合类型,而非取交集。

如果需要更简洁的封装,可以把逻辑整合为一个工具类型:

type AllSecondLevelKeys<T> = KeysOfUnion<T[keyof T]>;

type animals = AllSecondLevelKeys<typeof json>;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 05:12:40