繁体   English   中英

如何在打字稿中使用生成器功能

[英]How to use generator function in typescript

我正在尝试在打字稿中使用生成器功能。 但是编译器会抛出错误

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

这是相同的游乐场链接

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

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

我看到这个错误是因为我的tsconfig.json是针对es5

我只是从以下内容更改(摘录):

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

到:

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

错误消失了。

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

要解决这个问题,了解生成器函数(简称生成器)及其返回值的区别非常重要。

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

迭代器有一个next方法(这是您在问题中寻找的方法)。 可迭代对象有一个名为Symbol.iterator的属性(指定一个默认迭代器),这使得它们可以在 for 循环中使用。

因为生成器函数返回一个生成器对象,而生成器对象是一个可迭代的迭代器,所以你必须声明一个IterableIterator的返回类型。 在您的情况下,它将是IterableIterator<number>

因为这里的术语非常相似,所以我录制了一个解释差异的生成器教程 确保您的设定targetes6tsconfig.json ,使用发电机的功能时。

在此处输入图片说明

这是另一个使用 Generator 类型的打字稿的示例。 分配迭代器时的某些类型,例如const iterator: Generator<number>可以省略,因为 TS 可以推断它们。 但是,为了更加明确,我将它们包含在此示例中。

class GeneratorClass {
    *generator(count:number): Generator<number> {
        while(count < 3)
            yield count++;
    }   
}

const generatorObject = new GeneratorClass();

// Getting our generator object which we can use as an iterator.
const iterator: Generator<number> = generatorObject.generator(1);


console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
/*
[LOG]: {
  "value": 1,
  "done": false
} 
[LOG]: {
  "value": 2,
  "done": false
} 
[LOG]: {
  "value": undefined,
  "done": true
} 
*/

// Alternative more clean for of syntax. 
// For of can iterate over any iterable
// Can be used since every Generator is an Iterator
const iterator2: Generator<number> = generatorObject.generator(1);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM