Javascript 如何";“固定”;当您从逻辑中知道类型正确时,流类型是什么?

Javascript 如何";“固定”;当您从逻辑中知道类型正确时,流类型是什么?,javascript,optional,flowtype,Javascript,Optional,Flowtype,考虑一个函数,它接受/创建一个maybe类型(比如一个数字);然后是另一个不接受这种类型的函数。为了使它“工作”,我通过在函数周围添加一个条件来保护不采用maybe类型的函数 一个简单的例子: /* @flow */ export function nullOrUndefined(val: mixed): boolean { return val === null || val === undefined; } function foo(x: ?number) { console

考虑一个函数,它接受/创建一个maybe类型(比如一个数字);然后是另一个不接受这种类型的函数。为了使它“工作”,我通过在函数周围添加一个条件来保护不采用maybe类型的函数

一个简单的例子:

/* @flow */

export function nullOrUndefined(val: mixed): boolean {
    return val === null || val === undefined;
}

function foo(x: ?number) {
  console.log(!nullOrUndefined(x) ? addOne(x) : null);
}


function addOne(x: number) {
  return x + 1;
}
nullOrUndefined
将是一个通用的保护,我创建它是为了有一个简单的实用程序函数,它是表达性的,所以我不必连续输入“复杂”测试

上述功能可以正常工作,不会引发错误。(只要
foo
接收到未定义或空的数字

但是,flow会产生以下错误:

8:   console.log(!nullOrUndefined(x) ? addOne(x) : null);
                                              ^ Cannot call `addOne` with `x` bound to `x` because null or undefined [1] is incompatible with number [2].
    References:
    7: function foo(x: ?number) {
                       ^ [1]
    12: function addOne(x: number) {
                           ^ [2] 

我理解发生此错误的原因(flow无法查看任何任意函数,而且
nullOrUndefined
甚至不在同一个文件中)


但是,我如何解决这个问题呢?除了
/$FlowFixMe
?或者这是显式“忽略行”的正确用法吗?

啊,flow对您的案例有一流的支持。您的错误可以通过添加一个令牌来解决:
%checks

export function nullOrUndefined(val: mixed): boolean %checks {
  ...


%checks
用于向flow指示所指示的函数是一个。请注意,flow中的细化非常基本,并且很容易被基本上比您的函数更复杂的函数所混淆。

虽然这应该可以工作,但在跨文件使用“类型细化谓词”时,这实际上似乎失败了(使用es6导入系统)。哪一个更复杂的类型优化会失败?