TypeScript 2.8.3 Type必须具有一个返回迭代器

时间:2018-05-08 13:11:28

标签: typescript

我遇到了一个错误,指出 Type必须有' [Symbol.iterator]()'返回迭代器的方法。。它希望在划界线上:

class Test {
    private async do() {
        const done = [...(await this.test())]; // Here's the error
    }

    private async *test(): AsyncIterableIterator<string> {
        return;
    }
}

我在TypeScript GitHub存储库中发现了一些问题,但似乎都没有帮助。他们都建议在lib添加新条目。我使用es6目标,并添加了esnextdomes2018。这对错误没有任何影响。

我是否会错过更多lib个条目(我怀疑这些条目是我所使用的条目是否包含所有内容)或者我使用的代码是无效的?

4 个答案:

答案 0 :(得分:4)

这帮助了我。 在tsconfig中,添加以下内容:

{
    "compilerOptions": {
        "lib": [
            "es5", "es6", "dom", "dom.iterable"
        ]
    }
}

答案 1 :(得分:1)

尽管语法可能暗示,async生成器函数不是返回生成器的async函数。

the proposal所述,

  

异步生成器函数与生成器函数类似,但有以下区别:

     

调用时,异步生成器函数返回一个对象,一个异步生成器,其方法(next,throw和return)返回{value,done}的promise,而不是直接返回{value,done}。这会自动使返回的异步生成器对象成为异步迭代器。

它返回异步生成器,而不是promise,所以await它没有任何好处。

由于异步生成器具有Symbol.asyncIterator而不是Symbol.iterator,因此它是不可迭代的迭代器,即它不能使用常规ES6方法(Array.fromfor..of进行迭代,扩展语法等)。这就是for await..of被引入的原因。

上面的代码应该是:

const values = [];

for await (const value of this.test()) {
  values.push(v);
}

异步迭代器的迭代可以类似于常规迭代器,但不同之处在于next()返回下一个值的承诺,而不是值本身:

const iterator = this.test();
let next;

while ((next = await iterator.next()).done === false) {
  values.push(next.value);
}

由于异步生成器规范是一个提议,因此ES6迭代方法中对异步迭代器的支持可能会发生变化。

答案 2 :(得分:1)

正如我上面所述,遗憾的是,扩展运算符目前不支持异步迭代器。 GitHub中的相关问题是@jedwards1211 said:

回顾那个问题(减去无关的东西,比如“你可以这样做,哎呀,你不能,不要介意”):

@domenic ansered:

  

阵列传播运营商支持是否会成为此提案的一部分?

start one

  

不是这个提案的一部分......另一个提案当然可以在这里考虑新的东西。

我在其他地方没有看到提案(想要@estus's answer?)。在任何情况下,由于它不是JavaScript ESNext的一部分,因此很可能不会添加到TypeScript中。

最可行的替代方案是http://ruby-doc.org/stdlib-2.0.0/libdoc/json/rdoc/JSON.html#method-i-parse中详述的library(forecast) library(ggfortify) AirPassengers_train <- head(AirPassengers, 100) AirPassengers_test <- tail(AirPassengers, 44) ## Holdout Evaluation n_train <- length(AirPassengers_train) n_test <- length(AirPassengers_test) pred_train <- ts(rnorm(n_train)) pred_test <- ts(rnorm(n_test)) fit <- tslm(AirPassengers_train ~ trend + pred_train) forecast(fit, newdata = data.frame(pred_train = pred_test)) %>% accuracy(AirPassengers_test) #> ME RMSE MAE MPE MAPE MASE #> Training set 1.135819e-15 30.03715 23.41818 -1.304311 10.89785 0.798141 #> Test set 3.681350e+01 76.39219 55.35298 6.513998 11.96379 1.886546 #> ACF1 Theil's U #> Training set 0.6997632 NA #> Test set 0.7287923 1.412804 ## tsCV Evaluation fc_reg <- function(x) forecast(x, newdata = data.frame(pred_train = pred_test), h = h, model = fit) tsCV(AirPassengers_test, fc_reg, h = 1) #> Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec #> 1957 NA NA NA NA NA NA NA NA #> 1958 NA NA NA NA NA NA NA NA NA NA NA NA #> 1959 NA NA NA NA NA NA NA NA NA NA NA NA #> 1960 NA NA NA NA NA NA NA NA NA NA NA NA forecast(AirPassengers_test, newdata = data.frame(pred_train = pred_test), h = 1, model = fit) #> Error in forecast.ts(AirPassengers_test, newdata = data.frame(pred_train = pred_test), #> : Unknown model class 语法。对不起,我无法提供更多帮助。祝你好运!

答案 3 :(得分:0)

如果添加就会出错

"strict": false

在 tsconfig.json 中