Javascript 如何指定可以在flowjs中未定义的参数

Javascript 如何指定可以在flowjs中未定义的参数,javascript,flowtype,Javascript,Flowtype,我是flowjs新手,还不了解如何在flowjs中建模未定义参数的典型用例 function msg(message: string, callback: ?Function) { // ... if (_.isFunction(callback)) { callback(); } } 使用flow检查上述功能时,显示以下错误消息: 无法在可能为空值的函数调用中调用函数 无法对可能未定义的值调用函数 我确实理解显示错误的原因,但我不确定如何告诉flowjs这是

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

function msg(message: string, callback: ?Function) {
   // ...
   if (_.isFunction(callback)) {
      callback();
   }
}
使用flow检查上述功能时,显示以下错误消息:

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

我确实理解显示错误的原因,但我不确定如何告诉flowjs这是故意的,因为只有当参数不为null或未定义时才会调用回调?

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

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


详见

Hrm,这看起来应该行得通,但不确定发生了什么。也许可以尝试更具体的
if(typeof callback==='function'){
。此外,确保没有任何代码代替
/…
,以便更好地隔离问题。此外,实际的流错误打印输出可能会有所帮助。知道这实际上应该已经起作用了。我的示例是(一如既往)对于泛型代码和实际的生产代码,我通常以更明确的方式进行空检查,比如if(uu.isFunction(callback)),这就解释了。Flow不知道
..isFunction(callback)
仅当
callback
是一个函数时才返回
true
。它只知道返回一个布尔值(如果您设置了下划线/lodash的接口文件)。您应该执行本机JS检查,然后Flow可以将回调类型从
?Function
细化为
Function