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

TypeScript 5.2.2中为类zip元组转对象数组工具函数正确标注类型

解决TS2322错误并实现类Python zip的rowsToObjects函数

问题本质

你碰到的TS2322错误,核心是TypeScript无法确认TcolTuple[i]属于合法的对象键类型(string | number | symbol);而移除类型断言后,编译器会合并所有行值的类型,导致键值无法精准关联。

解决方案

通过约束列名元组的元素为合法键类型,再用映射类型关联列名与对应行值的索引,即可解决编译错误并实现精准类型推断:

完整代码

// 辅助类型:将列名元组与行数据元组映射为目标对象类型
type RowToObject<Cols extends readonly (string | number | symbol)[], Row extends readonly any[]> = {
  [K in Cols[number]]: Row[Cols['indexOf'](K)]
};

function rowsToObjects<Cols extends readonly (string | number | symbol)[], Row extends readonly any[]>(
  columns: Cols,
  rows: readonly Row[]
): RowToObject<Cols, Row>[] {
  return rows.map(row => {
    const result = {} as RowToObject<Cols, Row>;
    columns.forEach((col, index) => {
      result[col] = row[index];
    });
    return result;
  });
}

关键细节说明

  1. 约束列名类型:通过Cols extends readonly (string | number | symbol)[]强制列名元组的元素为合法对象键类型,直接解决TS2322错误。
  2. 精准关联键值类型:RowToObject辅助类型通过Cols['indexOf'](K)获取列名在元组中的索引,关联行数据对应位置的类型,确保每个键对应的值类型完全匹配。

使用示例

const columns = ['name', 'age', 'userId'] as const;
const rows = [
  ['Alice', 28, 1001],
  ['Bob', 32, 1002]
] as const;

const userObjects = rowsToObjects(columns, rows);
// userObjects的类型为:
// { name: "Alice" | "Bob"; age: 28 | 32; userId: 1001 | 1002; }[]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 01:25:08