TypeScript中如何通过嵌套映射将数组类型转换为目标类型?
TypeScript数组类型映射为目标对象类型解决方案
正确实现代码
const a = { label: "A", actions: { a() {}, b() {}, }, } as const; const b = { label: "B", actions: { c() {}, d() {}, }, } as const; type I = [typeof a, typeof b]; // 目标类型实现 type T = { [Item in I[number] as Item["label"]]: Item["actions"]; };
代码说明
- 直接遍历数组类型
I的所有元素(I[number]获取元组的元素联合类型) - 使用
as Item["label"]将每个元素的label属性值作为对象的键 - 将对应元素的
actions属性值作为该键的类型,精准绑定每个label与对应actions的类型关系,避免联合类型混淆。
原代码问题分析
- 冗余的
M类型:M<T>会对传入类型的label做映射,当T为联合类型时,会生成包含所有label键的对象,导致每个键都带上所有actions的联合类型。 - 映射逻辑绕路:原代码遍历元组的索引键(
0、1)再转换为label,过程中未正确保留单个元素的label与actions的对应关系,导致TypeScript将所有元素类型合并为联合类型处理。
内容的提问来源于stack exchange,提问作者jayatubi
相关产品推荐
相关产品推荐

