javascript - 在 Typescript 中使用 AsyncIterator – 必需选项

标签 javascript node.js typescript async-await async-iterator

考虑这个基本的 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);
   }
})();

在 Node 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 选项?

最佳答案

进一步深入研究该问题后,发现这是由于多个问题造成的。

异步迭代器不能依赖其上下文(例如 this.i)来访问不属于 AsyncIterator 接口(interface)的属性。这样做不会在当前版本的 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 });
      }
    };
  }
};

现在问题似乎与第二个 return 语句中缺少 value 有关。因为IteratorResult接口(interface)是这样定义的:

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 });
      }
    };
  }
};

关于javascript - 在 Typescript 中使用 AsyncIterator – 必需选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57063457/

相关文章:

Node.JS 输入数组的 POST 请求

reactjs - React、Typescript 和 Webpack 向页面添加 bundle.js 的问题

javascript - 如何在@require (Greasemonkey) 中使用自定义变量

javascript - 为 HTTP 响应在 Node.JS 中迭代对象

javascript - 从JSON响应中过滤ng-repeat

javascript - TypeScript 编译器 api : get position in generated code of a specific AST node

javascript - 应用程序路由优先于模块路由

javascript - 在javascript中用另一个对象数组排序

javascript - 客户端无法接收json

javascript - AngularJs错误: [$injector:modulerr] by ngRoute?