如何将TypeScript列表类型转换为指定键值对类型?
如何将TypeScript数组类型转换为对应键值对类型?
你遇到的问题是因为直接取setOfFunctions[number]["fun"]会得到所有函数类型的联合,导致每个键都对应所有可能的函数类型。要实现一一对应的键值对,需要利用TypeScript 4.1及以上版本支持的映射类型重映射(as子句),或者通过条件类型精准匹配每个键对应的元素类型。
方法一:使用映射类型重映射(推荐)
这种写法最简洁直观,直接遍历数组的每个元素类型,将元素的name作为键,fun作为对应的值:
type setOfFunctions = [{ name: 'hi', fun: () => number }, { name: 'world', fun: () => string }] type MyFunctions = { [T in setOfFunctions[number] as T["name"]]: T["fun"] }
编译后得到的类型正是你预期的:
type MyFunctions = { hi: () => number; world: () => string; }
方法二:使用条件类型配合Extract
如果需要更通用的工具类型,可以封装成一个泛型,通过Extract提取出与当前键匹配的元素类型,再获取对应的函数类型:
type MapFunctionArray<T extends { name: string; fun: unknown }[]> = { [K in T[number]["name"]]: Extract<T[number], { name: K }>["fun"] } // 使用示例 type MyFunctions = MapFunctionArray<setOfFunctions>
这个工具类型可以复用在类似结构的数组类型转换中,结果和方法一一致。
内容的提问来源于stack exchange,提问作者shkumbin hasani
相关产品推荐
相关产品推荐

