2017-08-27 27 views
1

我有一個Redux減速器的偏好設置,我使用流量類型檢查器。我的減速器可以採取兩種類型的動作。一個用於加載初始應用加載時發生的所有偏好。第二種操作類型發生在用戶更新特定首選項時。這是我的減速機的代碼。在那裏我遇到的問題是,當我嘗試做action.prefs.forEach此時流動拋出一個錯誤說...'prefs': Property not found in 'object type'流量類型檢查:如何迭代redux操作中可能未定義的屬性?

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

正如你可以看到我有兩種類型的操作。加載所有首選項時,該操作具有一系列首選項。 [ { _id: 'color', value: 'blue' } ]當更新一個首選項時,我得到一個id和一個值。所以,給我兩個具有不同屬性的動作類型,我如何獲得流動來避免在動作流類型中拋出這種變化的錯誤?

回答

1

由於一些指導從@羅斯 - 阿倫和一些對flow.org玩弄我已經找到了working solution

它的缺點是,除了羅斯的回答加入+type: UPDATE_PREF,我還需要加typeof。所以工作actionType是:

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

再次感謝@ ross-allen。

1

爲了說明Flow在disjoint union中選擇哪種類型,+type必須是值而不是string。更改actionType使用值:

// @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 
}; 
+0

謝謝羅斯。不幸的是,這似乎並沒有擺脫這個錯誤。 – yourfavorite

+0

@yourfavorite除了上述更改,請嘗試從我的答案https://stackoverflow.com/a/44640430/368697 –

+0

我無法弄清楚你的例子的哪個部分將解決這個問題,但我想出瞭如何解決flow.org/try上的錯誤感謝你的例子。我創建了一個沒有錯誤的流,但現在的問題是當狀態另一部分的操作被觸發時,它會導致TypeError,因爲它與我的兩個actionType中的任何一個都不匹配。我將爲此創建一個新的SO問題,因爲這是一個不同的問題。我正在用這個解決方案創建一個新的答案,希望它可以在未來幫助其他人。謝謝你的幫助! – yourfavorite

相關問題