typescript - 使用默认数组迭代器实现 Iterable 接口(interface)

标签 typescript typescript-generics

我有一个实现 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 中获取迭代器,以进行迭代。

Playground


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]
  }
}

See playground

关于typescript - 使用默认数组迭代器实现 Iterable 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68231488/

相关文章:

node.js - (node.js 模块)sharp 图像处理器保持源文件打开,调整大小后无法取消链接原始文件

css - 如何在 typescript 中调用线性渐变函数?

reactjs - Typescript & ReactJS 如何动态设置状态

google-chrome - Visual Studio Code 调试 chrome,断点不会命中

reactjs - 从传递给通用 React 组件的回调返回的对象属性的 Typescript 验证?

typescript - 如何使用嵌套接口(interface)限定 TypeScript 泛型类型的范围

angular - 如何在叠加层内关闭点击事件的primeng p-overlaypanel [Angular]

javascript - 在 TypeScript 中使泛型参数的顺序变得多余?

typescript - 确定泛型方法类型的默认参数

typescript - 如何输入对应类型的元组数组?