如何在TypeScript中从两个数组创建带精确类型的对象?
从键值数组创建带精确对应类型的TypeScript对象
要实现每个键对应值数组同索引的精确类型,核心是利用TypeScript的元组索引映射和键重映射特性,让键和值的位置一一关联,而非简单取联合类型。
解决方案代码
// 定义精确映射的对象类型:将元组T的每个索引I对应的键T[I],映射到元组J同索引的值类型J[I] export type DynamicObjectType< T extends readonly PropertyKey[], J extends readonly unknown[] > = { [I in keyof T as T[I]]: J[I] } // 核心转换函数:约束键数组T和值数组J长度一致 export const twoArraysToObject = < T extends readonly PropertyKey[], J extends { [I in keyof T]: unknown } >(keys: T, values: J): DynamicObjectType<T, J> => { return keys.reduce((output, key, index) => { return { ...output, [key]: values[index] } }, {} as Partial<DynamicObjectType<T, J>>) as DynamicObjectType<T, J> } // 柯里化调用函数:确保键数组和值数组长度匹配 const outerCall = <T extends readonly PropertyKey[]>(...keys: T) => <J extends { [I in keyof T]: unknown }>(...values: J) => twoArraysToObject(keys, values) // 示例调用 const objectFromArrays = outerCall('a', 'b', 'c')(1, 2, true)
类型效果验证
此时objectFromArrays的类型会被正确推断为:
{ a: number; b: number; c: boolean; }
关键细节说明
- 类型定义:
DynamicObjectType通过[I in keyof T as T[I]]实现键重映射——遍历元组T的索引(0、1、2等),将索引转换为对应的键名('a'、'b'、'c'),同时值类型取元组J同索引的类型。 - 泛型约束:
J extends { [I in keyof T]: unknown }确保值数组的长度和键数组完全一致,避免键值数量不匹配的错误。 - 类型断言:
reduce初始值用Partial<DynamicObjectType<T, J>>是因为初始对象为空,逐步添加属性后再断言为完整类型,符合TypeScript的类型检查逻辑。
内容的提问来源于stack exchange,提问作者Chris Simpson
相关产品推荐
相关产品推荐

