TypeScript实现类Python的zip函数 可变元组泛型类型推导问题
问题根源
你的原始代码核心错误是泛型约束和类型提取逻辑不符合需求:你定义的T extends any[]对应的是入参整体的类型,比如传入[1,2,3]和['a','b','c']时,T的实际类型是[number[], string[]],所以你做as T断言时,得到的自然是「数组组成的元组」,和你需要的「元素组成的元组」正好差了一层类型。
修正后可直接使用的代码
利用TS可变泛型+元组映射类型,直接提取每个入参数组的元素类型,组合成你需要的返回元组:
function* zip<T extends any[][]>(...args: T): Generator<{ [K in keyof T]: T[K][number] }> { const minLength = Math.min(...args.map(arr => arr.length)) for (let i = 0; i < minLength; i++) { yield args.map(arr => arr[i]) as { [K in keyof T]: T[K][number] } } }
效果验证
调用zip([1, 2, 3], ['a', 'b', 'c'])时,返回生成器的yield值会自动推导为[number, string]类型,完全匹配你的需求。这里的类型断言是安全的:运行时逻辑保证了返回数组的长度和元素类型完全符合我们定义的映射类型,不会出现类型不匹配的问题。
内容的提问来源于stack exchange,提问作者dcbaker
相关产品推荐
相关产品推荐

