TypeScript / Redux。无法为减速器编写接口。错误TS2322

时间:2018-10-06 16:27:44

标签: typescript redux

我不明白,为什么一旦在声明中使用interface ITitleIconSwitch的类型为state的{​​{1}}时总是出现错误。

interface ITitleIconSwitch {
  'TITLE_ICON_SWITCH': (state: object) => {
    state: object; // this line provides me with an error stack. But! Without 'state' interface works fine. Why?
    titleSwitch: boolean;
  }
}

const actionHandlers: ITitleIconSwitch = {
  'TITLE_ICON_SWITCH': state => ({
    ...state,
    titleSwitch: false
  })
}

错误消息:

  

TS2322:

     

键入'{[TITLE_ICON_SWITCH] :(状态:对象)=> {titleSwitch:false; }; }”不能分配给“ IActionHandlers”类型。

     

键入'{[TITLE_ICON_SWITCH] :(状态:对象)=> {titleSwitch:false;   }; }”不能分配给“ IStateUpdate”类型。

     

类型'{{TITLE_ICON_SWITCH]中缺少属性“ STATE_UPDATE” :(状态:对象)=> {titleSwitch:false; }; }'。

1 个答案:

答案 0 :(得分:1)

您需要将reducer的类型编写为函数,而不是对象,因为您以面向对象的风格声明了reducer。因此,您需要对此减速器的类型进行相同的操作:

{
                    id: 37429,
                    debug: true,
                    title: '37429',
                    filters: {
                        3: {
                            title: '3',
                            all: true,
                            values: {
                                2006: {
                                    title: '2006',
                                    order: 0,
                                    checked: true
                                }
                            },
                            indicator: false
                        },
                        58835: {
                            title: '58835',
                            all: false,
                            values: {
                                1785924: {
                                    title: '1785924',
                                    checked: true
                                }
                            },
                            indicator: false
                        },
                        58423: {
                            title: '58423',
                            all: false,
                            values: {
                                1785900: {
                                    title: '1785900',
                                    checked: true
                                }
                            },
                            indicator: false
                        }
                    }
                }

,然后将它们添加到特定的reducer:

export interface ITitleIconSwitch { . // typing for reducer
  [TITLE_ICON_SWITCH]: (state: object) => {
    titleSwitch: boolean
  }
}

export interface ITitleState { // typing for reducer state
  titleSwitch: boolean
}