导入flowtype不相交联合?

时间:2016-09-13 09:11:38

标签: javascript redux flowtype

在当前的react / redux项目中使用flowtype 我在我的actions.js文件中定义了一个不相交的联合类型:

export type ArticleAction =
   { type: 'ARTICLE_SET_EDITION' }
  | { type: 'ARTICLE_BLABLA', blip: string };

然后在我的减速机中我有

import type { ArticleAction } from './actions';

[...]
 
const articlesReducer = (state: any = initialState, action: ArticleAction): any => {
  if (action.type === 'ARTICLE_BLABLA') {
    const test = action.blip.shoups;
    return test;
  }
 }

Flow无法检测到问题。

但是!如果我直接在reducer.js中声明ArticleAction,它确实认识到action.blip.shoups无效,因为blip是一个字符串。

对我做错了什么的想法? THX

1 个答案:

答案 0 :(得分:2)

  

TL; DR 在今天的情况下,流量不会出现错误,但很可能会在将来出现。

这与导入/导出甚至联合类型没有任何关系,你可以简化它一直到这个:

function method(val: 'foo') {
  if (val === 'bar') {
    // unreachable...
  }
}

Flow可以看出这是一个不可能的改进,并且可以知道内部代码是无法访问的。但是,Flow在无法访问的方案中不会出错。今天它只是将val的值标记为该代码路径中的“空”类型并继续前进。

我们已经开始为此可达性分析奠定基础,并将在未来版本的Flow中使用它来创建错误。

我们还可以使用可达性分析来测试穷举,即:

function method(val: 'foo' | 'bar') {
  if (val === 'foo') {
    // ...
  } else if (val === 'bar') {
    // ...
  } else {
    // possibilities of val have been exhausted, this is unreachable...
  }
}

这些是常见的请求,我们正在研究它们。