如何为实现Tuple接口的Vector类添加默认数组迭代器
问题原因
- TypeScript 的接口仅存在于编译阶段,不会提供任何运行时实现。你定义的
Tuple接口继承了Iterable<T>只是给类型加了约束,要求实现该接口的类必须有迭代器方法,不会自动给Vector类注入运行时的迭代器逻辑。 - 你之前测试的
t变量本质是原生数组,JS原生数组本身内置了Symbol.iterator实现,所以可以直接迭代;而你自定义的Vector类没有运行时的迭代器方法,所以会触发编译报错。
现有实现的逻辑说明
你当前写的生成器迭代器是完全可用的,相关说明如下:
- 运行逻辑:生成器函数会在每次
for-of调用迭代器next()方法时执行,从下标0开始逐个返回实例对应下标的数值,直到下标等于length属性时结束迭代,完全符合类数组结构的迭代需求。 Iterator<number, any, undefined>泛型参数说明:- 第一个参数:迭代过程中产出的元素类型,这里你迭代的是数字,所以是
number - 第二个参数:迭代完全结束后,迭代器
return()方法返回的 value 类型,你没有显式写return语句,所以写any或者void都可以 - 第三个参数:调用迭代器
next()方法时传入的参数类型,你的迭代器不需要接收外部传参,所以是undefined
- 第一个参数:迭代过程中产出的元素类型,这里你迭代的是数字,所以是
更优的复用实现方案
完全可以复用JS原生的迭代器逻辑,不需要自己写循环,根据你的Vector实现可以选两种方案:
方案1:如果Vector内部用数组存储元素
假设你的类内部有存储元素的私有数组data,直接返回该数组的迭代器即可:
[Symbol.iterator]() { return this.data[Symbol.iterator]() }
方案2:如果Vector直接把元素挂在实例下标上(纯类数组结构)
直接调用原生数组的values方法绑定当前实例即可:
[Symbol.iterator]() { return Array.prototype.values.call(this) }
这两种方案都复用了JS引擎优化过的原生迭代器逻辑,性能优于手写生成器,代码也更简洁。
内容的提问来源于stack exchange,提问作者Devoev
相关产品推荐
相关产品推荐

