【问题标题】:How can I get TypeScript to automatically infer the type of the result of a `yield` call?如何让 TypeScript 自动推断 `yield` 调用结果的类型?
【发布时间】:2016-07-08 19:22:33
【问题描述】:

在以下代码示例中:

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

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

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

【问题讨论】:

  • 虽然函数内v 的类型是any,但如果我检查返回值的值:let a = gen() 我得到IterableIterator<Promise<number>>,这似乎是正确的。
  • v 的值由调用您的例程的客户端提供(在.next() 调用中);许多客户端理论上可以用许多不同的类型调用它,因此根据定义,TypeScript 无法推断类型,即使假设它能够对调用生成器的所有位置进行完整的静态分析。

标签: typescript generator type-inference yield


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2020-03-17
    • 2021-04-09
    • 2015-07-07
    • 1970-01-01
    • 2018-07-03
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多