我有一个实现 Tuple 的 Vector 类,像这样(简化代码,Tuple 接口(interface)基本上只是一个没有方法和固定大小 N 的数组):
interface Tuple<T, N extends number> extends ArrayLike<T>, Iterable<T> {
0: T
length: N
}
export class Vector<N extends number> implements Tuple<number, N> {
//Implementation
}
现在我想让我的 Vector 可迭代。当我创建一个 Tuple 类型的变量时,它已经是可迭代的,但 Vector 显然不是:
let t: Tuple<number,2> = [1,2]
for (const iterator of t) {...} //works
let v = new Vector([1,2])
for (const iterator of v) {....} //Type 'Vector<2>' must have a '[Symbol.iterator]()' method that returns an iterator.
我的问题是:如何将“默认”迭代器实现到我的向量中,这样我就不必再次编写函数了?我能以某种方式复制元组或数组迭代器吗? 如果这不可能,那么定义迭代器的最佳方式是什么?现在,我已将此(生成器)方法添加到我的 Vector 类中:
*[Symbol.iterator](): Iterator<number, any, undefined> {
for (let i = 0; i < this.length; i++) {
yield this[i]
}
}
它有效,但我不能 100% 确定它实际在做什么,返回值 Iterator
最佳答案
如果你希望你的类是可迭代的,你肯定必须以某种方式提供一个迭代器。但是,如果您只是想将迭代转发给您的类的一个属性,那么我认为您只需要实现一个从您想要迭代的任何内容中获取迭代器的 getter。
例如,像这样的东西:
export class Vector<N extends number> implements Tuple<number, N> {
constructor(public values: Tuple<number, N>) {}
get [Symbol.iterator]() {
return this.values[Symbol.iterator]
}
}
现在当你迭代它时,你实际上是从内部属性 values
中获取迭代器,以进行迭代。
Is there a way to this without keeping 'values' as an object property (e.g. by assigning the Symbol.iterator directly in the constructor)?
当然。默认情况下,迭代器属性是只读的,但如果您在类中声明迭代器类型,那么您就说它是可写的。然后在构造函数中赋值给iterator属性。
class Vector {
[Symbol.iterator]: () => Iterator<number>
constructor(public values: number[]) {
this[Symbol.iterator] = this.values[Symbol.iterator]
}
}
关于typescript - 使用默认数组迭代器实现 Iterable 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68231488/