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; }); }
关键细节说明
- 约束列名类型:通过
Cols extends readonly (string | number | symbol)[]强制列名元组的元素为合法对象键类型,直接解决TS2322错误。 - 精准关联键值类型:
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
相关产品推荐
相关产品推荐

