簡體   English   中英

在Typescript中使用AsyncIterator –必需的選項

[英]Use AsyncIterator in Typescript – required options

考慮以下來自MDN的基本AsyncIterator示例

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.得到一個Type '{ [Symbol.asyncIterator](): { i: number; next(): Promise<{ done: boolean; }>; }; }' is not an array type or a string type. Type '{ [Symbol.asyncIterator](): { i: number; next(): Promise<{ done: boolean; }>; }; }' is not an array type or a string type.

TS手冊中提到了幾個警告,但沒有一個可以解決我的問題。 奇怪的是, 迭代異步生成器可以正常工作。

使該示例編譯需要哪些tsconfig選項?

在深入研究問題之后,似乎是由於這里存在多個問題。

異步迭代器不能依賴其上下文(例如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 });
      }
    };
  }
};

現在,問題似乎與第二個return語句中缺少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 });
      }
    };
  }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM