如何实现带类型推导的TypeScript属性数组转对象reduce函数
TypeScript 键值对数组转对象的类型自动推导实现
要实现能自动推导目标对象类型的转换函数,核心是利用TypeScript的泛型联合类型和映射类型,精准捕获每个键值对的字面量类型:
完整实现代码
function arrayToObject<T extends { key: string; value: unknown }>( arr: readonly T[] ): { [K in T['key']]: Extract<T, { key: K }>['value'] } { return arr.reduce((obj, item) => { obj[item.key] = item.value; return obj; }, {} as { [K in T['key']]: Extract<T, { key: K }>['value'] }); }
类型逻辑说明
- 泛型约束
T:约束输入数组的元素必须包含key(字符串类型)和value(任意类型),当传入具体数组时,TypeScript会自动将T推导为数组所有元素的联合类型,每个元素保留key的字面量类型(比如"key1"而非string)和对应的value类型。 - 返回值映射类型:
[K in T['key']]遍历T中所有key的字面量类型,作为目标对象的键。Extract<T, { key: K }>从联合类型T中提取出key等于K的元素类型,再取其value类型,实现键与值类型的精准对应。
- 初始值类型断言:
reduce的初始空对象{}无法自动推导目标类型,因此用as断言为最终返回值类型,避免类型报错。
使用示例
const inputArr = [ { key: "key1", value: "my string" }, { key: "key2", value: 123 }, { key: "key3", value: false } ]; const resultObj = arrayToObject(inputArr); // 自动推导resultObj的类型为:{ key1: string; key2: number; key3: boolean }
调用函数时无需手动传入泛型参数,TypeScript会根据输入数组自动推导目标对象的具体类型。
内容的提问来源于stack exchange,提问作者Drico
相关产品推荐
相关产品推荐

