2017-04-12 66 views
3

this Facebook app sample使用終極版的風格和流動起來,我做了這樣一個動作類型:使用流量聯盟類型Redux的行動

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 } 
; 

但我發現,當我嘗試處理我的行爲如果我嘗試訪問nameprogress屬性,並說「在對象類型中沒有找到屬性」,則Flow會抱怨說有一個Reducer。

也就是說,在我的減速器中,如果我檢查action.type === 'HANDLE_IMAGE_PUBLISHED'然後訪問action.name,Flow會抱怨。當action.type === 'SET_IMAGE_UPLOAD_PROGRESS'時訪問action.progress屬性也是一樣的。據我所知,這些財產訪問應該在各自的情況下是合法的,但是Flow抱怨道。

由於某種原因,即使我工會中的某種類型沒有指定id屬性,我也可以在任何地方訪問action.id。我很困惑。

Here is a live demo in the Flow REPL。我究竟做錯了什麼?

回答

3

這是一個簡單的類型精無效的情況下:

https://flow.org/en/docs/lang/refinements/#refinement-invalidations

由於您使用的是一個回調的價值,流量悲觀地假設你可能會重新分配action回調運行之前(它不知道立即調用map回調)。它也沒有做分析,看看事實上沒有地方可以重新分配它。

所有這一切需要的是拉action作爲一個const

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

tryflow link

您可能還需要考慮你的.flowconfig使常量PARAMS。這基本上你所期望的:把所有參數視爲const

[options] 
experimental.const_params=true 
+0

我明白了,謝謝你的解釋。我想,使用'experimental.const_params = true'是有道理的,因爲我也使用ESLint的'no-param-reassign'規則。 – callum