将映射类型扁平化为交集并移除用于创建它的迭代联合键
如何将TypeScript映射生成的嵌套对象类型合并为扁平对象类型?
先看示例代码:
type MyUnion = "a" | "b"; type Result = { [K in MyUnion]: Record<`${K}_1`, { v: `${K}_2` }>; }; // 当前Result类型:{ a: Record<"a_1", { v: "a_2"; }>; b: Record<"b_1", { v: "b_2"; }>; } // 想要得到的目标类型: type DesiredResult = { "a_1": { v: "a_2" }; "b_1": { v: "b_2" }; };
要把Result转换成DesiredResult,可以通过索引访问+交叉类型自动合并的方式实现:
type MergeNestedObjects<T> = T[keyof T]; // 直接使用这个工具类型转换Result type FinalResult = MergeNestedObjects<Result>; // FinalResult的类型就是:{ "a_1": { v: "a_2"; }; "b_1": { v: "b_2"; }; }
原理说明
keyof Result会提取Result的所有键,也就是"a" | "b";Result[keyof Result]相当于Result["a"] & Result["b"],也就是两个单键对象的交叉类型:Record<"a_1", ...> & Record<"b_1", ...>;- TypeScript会自动将这种无冲突的交叉单键对象合并成一个扁平的对象类型,正好符合我们想要的
DesiredResult结构。
内容的提问来源于stack exchange,提问作者kuus
相关产品推荐
相关产品推荐

