Redux reducer的默认语句中的奇怪类型空流语法

时间:2017-07-12 12:53:06

标签: redux flowtype

我在这里搜索与redux一起使用flow的方法时找到了代码示例: https://flow.org/en/docs/frameworks/redux/

特殊的语法是(action:empty);它只是一些流魔法,只是在switch语句的默认情况下使用,还是有其他用途?

看起来不合适的函数类型语句没有返回值类型但是带有奇怪类型的参数'空的',我无法找到有关的文档。

// @flow
type State = { +value: boolean };

type FooAction = { type: "FOO", foo: boolean };
type BarAction = { type: "BAR", bar: boolean };

type Action = FooAction | BarAction;

function reducer(state: State, action: Action): State {
  switch (action.type) {
    case "FOO": return { ...state, value: action.foo };
    case "BAR": return { ...state, value: action.bar };
    default:
      (action: empty);
      return state;
  }
}

1 个答案:

答案 0 :(得分:6)

empty是Flow的bottom type。我认为其最初引入的主要动机是对称性,但事实证明它具有一些用途。正如您所知,在这种情况下可以使用它来使Flow强制执行详尽无遗。它可以在if / else语句链中类似地使用。

但是,当您希望Flow阻止任何实际值在某处结束时,它可以随时使用。这是非常模糊的,所以这里有几个例子:

// Error: empty is incompatble with implicitly-returned undefined
function foo(): empty {
}

// No error since the function return is not reached
function foo2(): empty {
  throw new Error('');
}

function bar(x: empty): void {
}

// Error: too few arguments
bar();
// Error: undefined is incompatible with empty
bar(undefined);

foo示例中,我们可以看到Flow强制在返回return的函数中永远不会达到empty。在bar示例中,我们可以看到Flow阻止调用函数。