如何让 TypeScript 自动推断 `yield` 调用结果的类型?

How can I get TypeScript to automatically infer the type of the result of a `yield` call?

在下面的代码示例中:

function* gen() {
    let v = yield Promise.resolve(0);
    return v;
}

v 的类型被推断为 any。我想知道是否有办法让它根据上下文线索推断出不同的类型(例如,number)。

我知道在这种特定情况下我可以使用 async/await,但我想知道一般情况(不使用 promises 时)。

不幸的是,Typescript 现在不支持这个。除了简单地在每个 yield 语句上放置类型注释之外,似乎没有真正好的解决方法:

function* gen() {
    let v: number = yield Promise.resolve(0);
    return v;
}

这是一个棘手的问题,因为 return 由 yield 语句编辑的值完全取决于使用生成器的任何内容的语义。我知道 yield Promise.resolve(0) 最终会 return 一个数字,只是因为我知道 coroutine 的语义,但 v 真的可以是任何东西。

但希望 Typescript 将添加对将这些关系声明为生成器本身类型的一部分的支持。这是 relevant github issue.