You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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;
}

关键细节说明

  1. 类型定义:DynamicObjectType通过[I in keyof T as T[I]]实现键重映射——遍历元组T的索引(0、1、2等),将索引转换为对应的键名('a'、'b'、'c'),同时值类型取元组J同索引的类型。
  2. 泛型约束:J extends { [I in keyof T]: unknown }确保值数组的长度和键数组完全一致,避免键值数量不匹配的错误。
  3. 类型断言:reduce初始值用Partial<DynamicObjectType<T, J>>是因为初始对象为空,逐步添加属性后再断言为完整类型,符合TypeScript的类型检查逻辑。

内容的提问来源于stack exchange,提问作者Chris Simpson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 13:07:18