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

TypeScript中如何提取嵌套对象内层键动态生成合并类型

问题原因

你之前的两种写法无法得到预期结果,核心原因如下:

  • 第一种写法的问题:对联合类型执行keyof操作时,TypeScript只会返回所有联合成员共有的键,而非所有成员键的并集。示例中temp[keyof temp]得到的是{aa: number} | {bb: number},两个类型没有公共键,因此keyof temp[keyof temp]返回never,最终生成空对象类型。
  • 第二种写法存在语法错误:泛型参数T未提前定义,且索引访问的书写顺序不符合TypeScript类型语法规则。
正确实现

使用TypeScript 4.1及以上版本支持的键重映射(as从句)实现,遍历外层对象的每个属性时,直接将键映射为对应内层对象的所有键,TypeScript会自动收集所有内层键值对,生成平级结构:

interface temp{
    a: {
        "aa":number
    }
    b:{
        "bb":number
    }
}

// 通用可复用的内层属性提取工具类型
type ExtractInnerProps<T extends Record<PropertyKey, object>> = {
  [OuterK in keyof T as keyof T[OuterK]]: T[OuterK][keyof T[OuterK]]
}

// 传入目标接口即可得到预期平级类型
type innerTemp = ExtractInnerProps<temp>
// 类型检查结果为 { aa: number; bb: number },完全匹配预期结构

重名键场景适配

如果不同内层对象存在同名键,上述写法会自动将对应键的类型合并为联合类型。如果需要将重名键的类型合并为交叉类型(保留所有类型约束),可以使用交叉合并版本的工具类型:

// 联合转交叉工具类型
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never

// 交叉合并内层属性的工具类型
type ExtractInnerPropsIntersect<T extends Record<PropertyKey, object>> = 
  UnionToIntersection<T[keyof T]>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 11:24:41