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

Car*_*lin 6 yield type-inference generator typescript

在以下代码示例中:

function* gen() {
    let v = yield Promise.resolve(0);
    return v;
}
Run Code Online (Sandbox Code Playgroud)

v推断的类型是any.我想知道是否有办法让它number根据情境线索推断出不同的类型(比方说).

我知道在这个特定场景中我可以使用async/ await而不是,但我想知道一般情况(当不使用promises时).

Ret*_*sam 4

不幸的是,Typescript 目前不支持这一点。除了简单地在每个语句上添加类型注释之外,似乎没有什么好的解决方法yield

function* gen() {
    let v: number = yield Promise.resolve(0);
    return v;
}
Run Code Online (Sandbox Code Playgroud)

这是一个很难解决的问题,因为yield语句返回的值完全取决于消耗生成器的任何内容的语义。我知道yield Promise.resolve(0)最终会返回一个数字,只是因为我知道 的语义coroutine,但v实际上可以是任何东西。

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