如何在TypeScript中声明压缩列表(zipped list)的元素类型?
解决TypeScript中zip数组的类型定义问题
你遇到的核心问题是TypeScript默认会把[x, arr2[i]]推断为联合类型数组,而非精准的元组类型。以下是几种不用any的解决方案:
方法一:给zip变量指定元组数组类型
先明确zip数组的每个元素是固定长度的元组,而非普通数组:
// 建议替换成你实际使用的对象类型,比如{ id: number; name: string },不要用宽泛的object type YourObjectType = object; const arr1: YourObjectType[] = [/* 你的对象元素 */]; const arr2: number[] = [10, 2, 5]; // 定义zip为元组数组类型:Array<[对象类型, 数字类型]> const zip: Array<[YourObjectType, number]> = arr1.map((x, i) => [x, arr2[i]] as [YourObjectType, number]); // 此时map的item会自动推断正确类型 zip.map((item) => { const a = item[0]; // 类型为YourObjectType const b = item[1]; // 类型为number });
这里要给map的返回值加as [YourObjectType, number],因为TypeScript默认会把数组字面量推断为联合类型数组,手动断言成元组才能让类型精准。
方法二:直接给map的回调参数定义类型
如果不想提前给zip变量定义类型,可在后续map操作时直接指定item的元组类型:
zip.map((item: [YourObjectType, number]) => { const a = item[0]; // YourObjectType const b = item[1]; // number });
方法三:封装通用zip函数(复用性更高)
如果需要多次做zip操作,封装一个通用函数可以自动推断类型:
function zip<T, U>(arr1: T[], arr2: U[]): Array<[T, U]> { return arr1.map((item, index) => [item, arr2[index]] as [T, U]); } // 使用时自动推断类型,无需手动指定 const zip = zip(arr1, arr2); zip.map((item) => { const a = item[0]; // 自动推断为T类型(即你的对象类型) const b = item[1]; // 自动推断为U类型(即number) });
注意:若两个数组长度不一致,map会以较短数组的长度为准,需根据业务场景处理边界情况。
内容的提问来源于stack exchange,提问作者shinchan97
相关产品推荐
相关产品推荐

