代码之家  ›  专栏  ›  技术社区  ›  panepeter

在Typescript必需选项中使用AsyncIterator

  •  0
  • panepeter  · 技术社区  · 5 年前

    考虑这个基础 AsyncIterator Example from MDN :

    var asyncIterable = {
      [Symbol.asyncIterator]() {
        return {
          i: 0,
          next() {
            if (this.i < 3) {
              return Promise.resolve({ value: this.i++, done: false });
            }
    
            return Promise.resolve({ done: true });
          }
        };
      }
    };
    
    (async function() {
       for await (let num of asyncIterable) {
         console.log(num);
       }
    })();
    
    

    在节点10.16.0上运行此功能可以正常工作。然而,我似乎无法通过Typescript运行它。使用此tsconfig:

    {
      "compilerOptions": {
        "lib": ["es2016", "esnext.asynciterable"],
        "target": "es2016"
      }
    }
    

    导致错误 The type returned by the 'next()' method of an async iterator must be a promise for a type with a 'value' property. 目标的错误相同 esnext .

    target 完全可以选择,我有一个 Type '{ [Symbol.asyncIterator](): { i: number; next(): Promise<{ done: boolean; }>; }; }' is not an array type or a string type.

    这个 TS manual 提到了几个警告,但没有一个能解决我的问题。奇怪的是, iterating async generators 很好。

    编译此示例需要哪些tsconfig选项?

    0 回复  |  直到 5 年前
        1
  •  5
  •   Patrick Roberts Benjamin Gruenbaum    5 年前

    异步迭代器不能依赖其上下文(例如。 this.i )访问不属于 AsyncIterator 界面这样做不会在当前版本的TypeScript 3.6中编译(即使它在JavaScript中运行良好),因此,为了解决这个问题,我们只剩下:

    var asyncIterable = {
      [Symbol.asyncIterator]() {
        let i = 0;
        return {
          next() {
            if (i < 3) {
              return Promise.resolve({ value: i++, done: false });
            }
    
            return Promise.resolve({ done: true });
          }
        };
      }
    };
    

    现在这个问题似乎与 value IteratorResult 接口的定义如下:

    interface IteratorResult<T> {
      done: boolean;
      value: T;
    }
    

    这个 next() 方法必须 返回带有 value: number (再说一次,即使它在JavaScript中运行良好),最后我们有:

    var asyncIterable = {
      [Symbol.asyncIterator]() {
        let i = 0;
        return {
          next() {
            if (i < 3) {
              return Promise.resolve({ value: i++, done: false });
            }
    
            return Promise.resolve({ value: i, done: true });
          }
        };
      }
    };