当您从逻辑中知道类型是否正确时,如何“修复”流类型?

问题描述 投票:0回答:1

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

一个简单的例子:

/* @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] 

A small test

我理解为什么会发生这种错误(流不能查看任何任意函数,并且nullOrUndefined甚至不会在同一个文件中。

但是,我该如何解决这个问题呢?除了// $FlowFixMe?或者这是明确的“忽略线”是否正确使用的情况?

javascript optional flowtype
1个回答
1
投票

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

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

(try link)

%checks用于指示流动指示的函数是type refinement predicate。请注意,流程的细化是非常基本的,并且很容易被一个基本上比你的复杂的函数混淆。

© www.soinside.com 2019 - 2024. All rights reserved.