如何为TypeScript的zip函数编写支持任意参数的类型声明?
实现支持任意数量迭代器的zip方法类型声明
要实现支持任意数量参数的zip方法,同时让返回类型准确对应各迭代器的值类型元组,可以利用TypeScript的可变泛型元组和条件类型推断来实现。
具体实现步骤:
- 为
zip方法定义可变长度的泛型参数Bs,约束为包含任意数量Iterable或Iterator类型的数组; - 通过条件类型
infer推断每个参数对应的迭代值类型; - 将当前迭代器的类型
T与所有参数的迭代值类型合并为一个元组,作为返回值ItIterator的泛型参数。
类型声明代码:
class ItIterator<T> implements Iterator<T> { // 迭代器基础方法实现示例 next(): IteratorResult<T> { return { done: false, value: {} as T }; } zip<Bs extends (Iterable<any> | Iterator<any>)[]>( ...others: Bs ): ItIterator<[ T, ...{ [K in keyof Bs]: Bs[K] extends Iterable<infer X> | Iterator<infer X> ? X : never } ]> { // zip方法的具体合并逻辑(此处为占位实现) return {} as ItIterator<any>; } }
验证效果:
当你调用:
ItIterator.prototype.zip.call([1][Symbol.iterator](), ['a'], [false])
TypeScript会自动推断出返回类型为ItIterator<[number, string, boolean]>,完全符合需求。
关键点说明:
Bs extends (Iterable<any> | Iterator<any>)[]:确保传入的所有参数都是可迭代对象或迭代器;{ [K in keyof Bs]: Bs[K] extends Iterable<infer X> | Iterator<infer X> ? X : never }:遍历参数数组,逐个推断每个迭代器/可迭代对象的值类型;[T, ......]:将当前迭代器的值类型T放在元组首位,后面拼接所有参数的迭代值类型,形成最终的元组类型。
内容的提问来源于stack exchange,提问作者eri412
相关产品推荐
相关产品推荐

