TypeScript中嵌套对象扁平化并保留类型能否实现?
解答
可以实现,TypeScript 4.1及以上版本引入了模板字面量类型与递归条件类型,完全支持定义符合要求的Flattened泛型,可精准推导扁平化后的对象结构类型。
完整类型实现
// 辅助类型:遍历嵌套对象生成所有「路径+对应值类型」的元组联合 type FlattenEntries<T, Path extends string = ""> = T extends Record<string, any> ? { [K in keyof T & string]: FlattenEntries< T[K], Path extends "" ? K : `${Path}.${K}` > }[keyof T & string] : [Path, T]; // 最终Flattened类型:将元组联合转换为扁平化后的对象类型 type Flattened<T> = { [Entry in FlattenEntries<T> as Entry[0]]: Entry[1]; };
效果验证示例
const nested = { a: { b: { c: { d1: "hello", d2: 42, }, }, }, }; // 推导结果完全符合预期:{ "a.b.c.d1": string; "a.b.c.d2": number } type NestedFlattened = Flattened<typeof nested>; // 配套函数定义示例 function flatten<T extends Record<string, any>>(nested: T): Flattened<T> { // 此处省略JS层面的扁平化逻辑实现 return {} as Flattened<T>; } const flattened = flatten(nested); // 此时可获得完整类型提示:flattened["a.b.c.d1"]自动推导为string类型,flattened["a.b.c.d2"]自动推导为number类型
适用限制
- 仅支持TypeScript 4.1及以上版本,更低版本缺少模板字面量类型、递归条件类型、键重映射能力,无法实现该泛型。
- 上述实现默认只处理键为string类型的对象,如需支持number、symbol类型的键,可对类型逻辑做对应扩展。
内容的提问来源于stack exchange,提问作者andre_b
相关产品推荐
相关产品推荐

