如何改写TypeScript函数,将键值对象数组映射为指定类型对象?
改写
keyValueArrayToObject获取精确类型 要让keyValueObject的类型变成{a: number; b: string},需要从锁定原数组的字面量类型和优化函数泛型的类型推断两方面修改:
步骤1:锁定原数组的字面量类型
给arrayOfKeyValue加上as const,让TypeScript不再把key推断为宽泛的string、把value推断为number | string,而是精准识别每个元素的字面量类型:
const arrayOfKeyValue = [ {key: 'a', value: 1}, {key: 'b', value: 'z'}, ] as const;
步骤2:优化函数的泛型定义和返回类型
修改keyValueArrayToObject的泛型约束,用映射类型把数组中每个元素的key和对应的value类型一一对应起来:
const keyValueArrayToObject = <T extends readonly { key: PropertyKey; value: unknown }[]>( arr: T ): { [K in T[number]['key']]: Extract<T[number], { key: K }>['value'] } => { // 用as any做断言,因为Object.fromEntries返回的是宽泛类型,我们已通过泛型确保类型安全 return Object.fromEntries(arr.map(o => [o.key, o.value])) as any; };
最终效果
此时调用函数后,keyValueObject的类型会被精准推断为{a: number; b: string}:
const keyValueObject = keyValueArrayToObject(arrayOfKeyValue); // 类型检查时,keyValueObject.a是number类型,keyValueObject.b是string类型
内容的提问来源于stack exchange,提问作者msbb
相关产品推荐
相关产品推荐

