【问题标题】:New "Missing annotation" error in flowjs 0.54.0flowjs 0.54.0 中的新“缺少注释”错误
【发布时间】:2018-02-10 07:10:14
【问题描述】:

切换到flow 0.54.0后如下代码片段:

function runKarmaTest() {
    const KARMA_CONFIG = {};
    return new Promise(function (resolve, reject) {
        new karma.Server(KARMA_CONFIG, function (exitCode) {
            if (exitCode === 0) {
                resolve();
            } else {
                reject(exitCode);
            }
        }).start();
    });
}

报告如下错误:

Error: scripts/runKarma.js:76
               v----------------------------------------
 76:    return new Promise(function (resolve, reject) {
 77:            new karma.Server(KARMA_CONFIG, function (exitCode) {
 78:                    if (exitCode === 0) {
...:
 84:    });
        -^ type parameter `R` of constructor call. Missing annotation

return new Promise(function (resolve, reject) { 行中,我似乎无法弄清楚出了什么问题?

【问题讨论】:

  • 您之前使用的是哪个版本的 Flow? 0.52 或 0.53
  • 我刚从0.53.1升级

标签: javascript node.js flowtype


【解决方案1】:

看起来它想知道的东西是由 Promise 包裹的值的类型。在这种情况下,它看起来只是undefined,因为成功案例没有任何价值。您可能可以将返回 this 的函数注释为返回 Promise<void> 或类似的东西以消除此错误。

奇怪的是,这发生在 0.54 而不是之前。

【讨论】:

  • 新的问题其实不是flow上报的return new Promise(function (resolve, reject) {这一行,而是function runKarmaTest()定义本身缺少注解。
【解决方案2】:

runKarmaTest函数中的Promise<void>注解解决了这个问题:

function runKarmaTest(): Promise<void> {
    const KARMA_CONFIG = {};
    return new Promise(function (resolve, reject) {
        new karma.Server(KARMA_CONFIG, function (exitCode) {
            if (exitCode === 0) {
                resolve();
            } else {
                reject(exitCode);
            }
        }).start();
    });
}

我还是不确定:

  • 为什么在 0.54 中而不是之前需要此注释
  • 为什么流 Type Inference 无法从解析中缺少的参数推断出它

【讨论】:

  • Flow 要求您注释模块边界。你是对的,在许多情况下它可以推断它们,但它需要全局类型推断,这在大型代码库上会非常慢。如果一次只需要对一个模块进行类型推断,Flow 可以运行得更快。我不确定为什么现在需要这个注解,但我猜应该是修复了一个错误。
猜你喜欢
  • 2013-09-17
  • 1970-01-01
  • 2019-05-06
  • 2011-01-12
  • 2023-03-10
  • 2014-10-22
  • 2019-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多