我在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”关键字来实现它?
答案 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