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

