2016-11-22 67 views
6

在這段代碼中,流程不會抱怨在狀態上設置值dog。它似乎忽略了NamespaceData的定義。我已經設置了類型,所以應該抱怨。我正在使用核素,流程正常工作。流程不會抱怨錯誤的類型

action的所有屬性,如namespace,project,collection是字符串。

// @flow 

import { NAMESPACE_SET } from '../actions/NamespaceActions' 

type NamespaceData = { 
    project: string, 
    collection: string, 
} 

type NamespaceState = { 
    [namespace: string]: NamespaceData, 
} 
const initialState: NamespaceState = {} 

function namespaceReducer(state: NamespaceState = initialState, action: Object): NamespaceState { 
    switch (action) { 
    case NAMESPACE_SET: { 
     return { 
     ...state, 
     [action.namespace]: { 
      project: action.project, 
      collection: action.collection, 
      dog: 1, 
     } 
     } 
    } 
    } 
    return state 
} 

export default namespaceReducer 

回答

7

默認情況下,對象中未知屬性的流動並不嚴格,例如,

// @flow 

type Thing = { 
    known: string; 
}; 

var obj: Thing = { 
    known: 'hi', 
    unknown: 4, 
}; 

即使unknown不屬於該類型,但類型正確。

流量0.32包括

  • 的確切對象類型的新語法:使用{|和|}而不是{和}。其中{x:string}至少包含屬性x,{| x:string |}僅包含屬性x。

在你的榜樣,你會希望有確切的對象語法:

type NamespaceData = {| 
    project: string, 
    collection: string, 
|}; 
+0

啊,真棒。謝謝。我正在閱讀快速參考文檔而不是參考文獻! – PudgePacket

+0

我很想知道爲什麼有人downvoted :( – loganfsmyth