如何在打字稿

时间:2017-03-07 18:21:08

标签: javascript typescript ecmascript-6 generator

我正在尝试在打字稿中使用生成器函数。但编译器抛出错误

error TS2339: Property 'next' does not exist on type

以下是我最接近的代码示例。

export default class GeneratorClass {
    constructor() {
        this.generator(10);
        this.generator.next();
    }
    *generator(count:number): Iterable<number | undefined> {
        while(true)
            yield count++;
    }   
}

Here is the playground link for the same

3 个答案:

答案 0 :(得分:16)

函数返回的生成器上存在next方法,而不是生成器函数本身。

export default class GeneratorClass {
    constructor() {
        const iterator = this.generator(10);
        iterator.next();
    }
    *generator(count:number): IterableIterator<number> {
        while(true)
            yield count++;
    }   
}

答案 1 :(得分:4)

我看到此错误是因为 tsconfig.json 定位es5

我只是改变了(摘录):

"target": "es5",
"lib": [
    "es5",
    "es2015.promise"
]

为:

"target": "es6",
"lib": [
    "es6"
]

并且错误消失了。

注意:对于VS Code,我需要重新加载IntelliSense窗口以识别更改。

答案 2 :(得分:1)

要解决此问题,了解生成器函数(简称生成器)与其返回值之间的区别非常重要。

生成器函数(用星号标记)是一个返回生成器对象的函数。生成器对象满足迭代器可迭代的要求。

迭代器有一个next方法(这就是您要在问题中寻找的方法)。并且 iterables 具有一个名为Symbol.iterator(指定默认的迭代器)的属性,该属性使它们在for循环中可用。

由于生成器函数返回了生成器对象,并且生成器对象是可迭代的迭代器,因此必须声明返回类型为IterableIterator。您的情况是IterableIterator<number>

因为这里的术语令人困惑,所以我记录了Generator tutorial来解释不同之处。使用生成器功能时,请确保在target中将es6设置为tsconfig.json