Flow无法正确推断类型

时间:2016-12-20 16:32:44

标签: redux flowtype

我在redux中的Action创建器中定义了多个子类型:

行动创作者:

export type Action = { type: "SELECT", index: number } | { type: "OTHER" };

减速机:

module.exports = (state: string = "", action: Action): string => {
    switch (action.type) {
        case "SELECT":
            return action.index;
        default:
            return state;
    }
};

但如果我在常量const select = "SELECT"中定义 SELECT 并在上面的代码中实现它,我会收到一条错误消息:

property `index`. Property not found in object type

注意:采用流式模式,因为它是F8 app:

  

https://github.com/fbsamples/f8app/blob/master/js/actions/types.js

如何通过避免在action和reducer中都使用“SELECT”关键字来实现它?

1 个答案:

答案 0 :(得分:1)

你通常会有一个动作类型的常量,它将用于你的动作和减速器。

const SELECT = 'SELECT';

甚至更好(以避免任何冲突):

const SELECT = 'redux/<module>/SELECT';

在同一个操作文件中或在另一个操作文件中(完全取决于您)。然后只需导出export const SELECT,然后导入import { SELECT } from './constants'

您还应该查看redux-ducks,可能是您感兴趣的。

修改

他们使用bitwise OR对所有可能的不同操作案例进行分组。这有助于使用flow测试代码在语法上是否正确(通过将其调度的操作设置为匹配类型Action)。请参阅他们的完整解释here

这并没有消除他们必须以他们想要的动作类型发送动作的事实。 login