我正在尝试在打字稿中使用生成器函数。但编译器抛出错误
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++;
}
}
答案 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
。