【问题标题】:How to specify a parameter that can be undefined in flowjs如何指定一个可以在flowjs中未定义的参数
【发布时间】:2016-11-17 17:37:51
【问题描述】:

我是 flowjs 新手,还不明白如何在 flowjs 中建模未定义参数的典型用例。

function msg(message: string, callback: ?Function) {
   // ...
   if (_.isFunction(callback)) {
      callback();
   }
}

用流检查上述函数时,显示如下错误信息:

  • 无法在可能为空值的函数调用中调用函数。
  • 无法对可能未定义的值调用函数

我明白为什么会显示错误,但我不确定如何告诉 flowjs 这是故意的,因为回调仅在参数不为 null 或未定义时调用?

【问题讨论】:

  • Hrm 看起来应该可以,但不确定发生了什么。也许尝试更具体的if (typeof callback === 'function') {。此外,请确保您确实没有任何代码代替// ...,以便更好地隔离问题。此外,实际的流程错误打印输出可能会有所帮助。
  • 知道这应该实际工作已经有所帮助。我的示例(一如既往)是通用的,在我的实际生产代码中,我通常以更明确的方式进行 null 检查,例如 if (_.isFunction(callback))
  • 嗯,这就解释了。 Flow 不知道 _.isFunction(callback) 仅在 callback 是一个函数时才返回 true。它所知道的是它返回一个布尔值(如果您设置了下划线/lodash 的接口文件)。你应该做原生 JS 检查,然后 Flow 可以refine 回调类型从 ?FunctionFunction

标签: javascript flowtype


【解决方案1】:

Flow 不知道 _.isFunction(callback) 仅在 callback 是一个函数时才返回 true。它所知道的是它返回一个布尔值(如果您设置了下划线/lodash 的接口文件)。您应该改为进行原生 JS 检查,然后 Flow 可以将 callback 的类型从 ?Function 细化为 Function。像这样:if (typeof callback === 'function') { callback() }

更简单的类型检查也应该起作用:if (callback) { callback() },因为 Flow 知道如果 callback 不是假的,它必须是一个函数。

https://flowtype.org/docs/dynamic-type-tests.html查看更多信息

【讨论】:

    猜你喜欢
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多