Redux 使用流联合类型进行重复操作

Redux 使用流联合类型进行重复操作,redux,flowtype,Redux,Flowtype,按照同时使用Redux和Flow的风格,我以这种方式创建了一个动作类型: type Action = | { type: 'ADD_FILES', files: Array<{ id: number, file: File }> } | { type: 'HANDLE_IMAGE_PUBLISHED', id: number, name: string } | { type: 'SET_IMAGE_UPLOAD_PROGRESS', id: number, progres

按照同时使用Redux和Flow的风格,我以这种方式创建了一个动作类型:

type Action =
  | { type: 'ADD_FILES', files: Array<{ id: number, file: File }> }
  | { type: 'HANDLE_IMAGE_PUBLISHED', id: number, name: string }
  | { type: 'SET_IMAGE_UPLOAD_PROGRESS', id: number, progress: number }
;
类型动作=
|{type:'ADD_FILES',FILES:Array}
|{type:'HANDLE_IMAGE_PUBLISHED',id:number,name:string}
|{type:'SET_IMAGE_UPLOAD_PROGRESS',id:number,PROGRESS:number}
;
但我发现,当我尝试使用减缩器处理我的操作时,如果我尝试访问
名称
进度
属性,并说“在对象类型中找不到属性”,则流会抱怨

也就是说,在我的reducer中,如果我检查
action.type===“HANDLE\u IMAGE\u PUBLISHED”
,然后访问
action.name
,流就会抱怨。当
action.type=='SET\u IMAGE\u UPLOAD\u progress'
时,访问
action.progress
属性也是一样的。据我所知,这两种财产访问在各自的情况下都应该是合法的,但流量会引起投诉

但是出于某种原因,我可以在任何地方访问
action.id
,即使我的联合中的某个类型没有指定
id
属性。我很困惑


。我做错了什么?

这只是类型细化失效的一个例子:

因为您正在回调中使用该值,所以Flow悲观地假设您可以在回调运行之前重新分配
操作
(它不知道是否立即调用
映射
回调)。它也不会进行分析,以确定实际上没有位置可以重新分配它

只需将
操作作为
常量拉出即可:

export default (state: Array<ImageRecordModel> = [], action_: Action): Array<ImageRecordModel> => {
  const action = action_;
[options]
experimental.const_params=true

我明白了,谢谢你的解释。我想使用
实验性的.const_params=true
是有意义的,因为我也在使用ESLint的
无参数重新分配
规则。