流类型检查:如何在redux操作中迭代可能未定义的属性?

流类型检查:如何在redux操作中迭代可能未定义的属性?,redux,flowtype,Redux,Flowtype,我有一个用于首选项的Redux reducer,我正在使用流类型检查器。我的减速机可以执行两种类型的操作。一个用于加载初始应用程序加载时发生的所有首选项。第二种操作类型发生在用户更新特定首选项时。这是我的减速机的代码。遇到问题的地方是当我尝试执行action.prefs.forEach时,流在该点抛出一个错误,称为…'prefs':在“对象类型”中找不到属性 // @flow import { UPDATE_PREF, LOAD_PREFS_SUCCESS } from '../acti

我有一个用于首选项的Redux reducer,我正在使用流类型检查器。我的减速机可以执行两种类型的操作。一个用于加载初始应用程序加载时发生的所有首选项。第二种操作类型发生在用户更新特定首选项时。这是我的减速机的代码。遇到问题的地方是当我尝试执行
action.prefs.forEach
时,流在该点抛出一个错误,称为
…'prefs':在“对象类型”中找不到属性

// @flow
import {
  UPDATE_PREF,
  LOAD_PREFS_SUCCESS
} from '../actions/prefs';

export type actionType = {
  +type: string,
  prefs: Array<{_id: string, value: any}>
} | {
  +type: string,
  id: string,
  value: any
};

export default (state: stateType = {}, action: actionType) => {
  switch (action.type) {
    case LOAD_PREFS_SUCCESS: {
      const newState = {};
      action.prefs.forEach(p => {
        newState[p._id] = p.value;
      });
      return newState;
    }
    case UPDATE_PREF: {
      return { ...state, [action.id]: action.value };
    }
    default:
      return state;
  }
};
/@flow
进口{
更新_PREF,
加载优先成功
}来自“../actions/prefs”;
导出类型actionType={
+类型:字符串,
prefs:数组
} | {
+类型:字符串,
id:string,
价值:任何
};
导出默认值(状态:stateType={},操作:actionType)=>{
开关(动作类型){
案例加载预处理成功:{
const newState={};
action.prefs.forEach(p=>{
newState[p.\u id]=p.value;
});
返回新闻状态;
}
案例更新优先:{
返回{…状态,[action.id]:action.value};
}
违约:
返回状态;
}
};

正如你所看到的,我有两种类型的动作。加载所有首选项时,操作具有一系列首选项<代码>[{u id:'color',value:'blue'}]当更新单个首选项时,我会得到一个id和一个值。因此,给我的两个具有不同属性的动作类型,我如何让flow不抛出关于动作流类型变化的错误?

为了告诉flow在中选择哪种类型,
+type
必须是一个值,而不是
字符串。将
操作类型更改为使用值:

// @flow
import {
  UPDATE_PREF,
  LOAD_PREFS_SUCCESS
} from '../actions/prefs';

export type actionType = {
  +type: LOAD_PREFS_SUCCESS, // not just `string`
  prefs: Array<{_id: string, value: any}>
} | {
  +type: UPDATE_PREF,        // not just `string`
  id: string,
  value: any
};
/@flow
进口{
更新_PREF,
加载优先成功
}来自“../actions/prefs”;
导出类型actionType={
+类型:LOAD\u PREFS\u SUCCESS,//不仅仅是`字符串`
prefs:数组
} | {
+类型:UPDATE_PREF,//不仅仅是`字符串`
id:string,
价值:任何
};

多亏了@ross allen的指导和flow.org上的一些游戏,我找到了一个新的解决方案

简而言之,除了Ross关于添加
+type:UPDATE\u PREF
的回答之外,我还需要添加
typeof
。因此,工作动作类型为:

export type actionType = {
  +type: typeof LOAD_PREFS_SUCCESS,
  prefs: Array<{_id: string, value: any}>
} | {
  +type: typeof UPDATE_PREF,
  id: string,
  value: any
};
导出类型actionType={
+类型:加载类型\u优先\u成功,
prefs:数组
} | {
+type:typeof UPDATE_PREF,
id:string,
价值:任何
};

再次感谢@ross allen。

谢谢ross。不幸的是,这似乎无法消除错误。@yourfavorite除了上面的更改之外,请尝试我的答案。我不知道您的示例的哪一部分可以解决问题,但我在flow.org/try上找到了修复错误的方法,这要感谢您的示例。我已经创建了一个没有错误的流,但现在的问题是,当激发状态另一部分的操作时,它会导致TypeError,因为它与我的两个ActionType都不匹配。我将为此创建一个新的SO问题,因为这是一个不同的问题。我正在用这个解决方案创造一个新的答案,希望它能在将来帮助其他人。谢谢你的帮助!