减速器中的动作类型不兼容

时间:2020-01-17 08:35:22

标签: typescript redux react-redux

在我的应用中,我有许多不同的动作可能会或可能不会影响该州的同一部分。为了简化示例,我创建了以下小代码:


// @ts-ignore
import { handleActions } from 'redux-actions';

interface Thing{
    id: number
}

interface ActionA {
    type: string;
    payload?: Thing;
}

interface ActionB {
    type: string;
    payload?: Thing[];
}

interface State {
    things: Thing[];
}


const someActionA: ActionA = {
    payload: { id: 35 },
    type: 'actionA'
};

const someActionB: ActionB = {
    payload: [{ id: 35 }],
    type: 'actionB'
};

const reducer = handleActions({
    [someActionA.type]: (state: State, action: ActionA) => state,
    [someActionB.type]: (state: State, action: ActionB) => state,
}, {things: []});

如果不进行类型检查,则一切正常。但是,TS编译器在这种情况下会抱怨。因为有效载荷的类型不兼容。

我正在与类型斗争一段时间,每种类型都碰壁。 解决该问题的正确方法是什么?

我得到的错误:

TS2769:没有过载与该调用匹配。过载1之3, '(reducerMap:ReducerMap,initialState:状态,选项?: 选项|未定义):ReduxCompatibleReducer', 跟随错误。类型'{[x:string]:((state:State, 动作:ActionA)=>状态)| ((状态:状态,动作:ActionB)=> 州); }”不可分配给“ ReducerMap”类型的参数。索引签名不兼容。类型 '(((状态:状态,操作:ActionA)=>状态)| (((state:State,action: 无法将ActionB)=> State)'分配给类型'ReducerMapValue'。类型'(状态:状态,操作:ActionA)=>状态'是 不可分配给“ ReducerMapValue”类型。 类型“(状态:状态,操作:ActionA)=>状态”不能分配给类型“减速器”。种类 参数“ action”和“ action”不兼容。 类型“操作”不可分配给类型“操作A”。财产“有效载荷”的类型是 不相容。类型中缺少属性“ id” “状态”,但在“事物”类型中为必填项。重载2之3,'((reducerMap: ReducerMap,initialState:状态,选项?: 选项|未定义):ReduxCompatibleReducer',给出了以下错误。类型'{[x: 字符串]:((状态:状态,操作:ActionA)=>状态)| ((state:State, 动作:ActionB)=>状态); }'不能分配给类型的参数 “ ReducerMap”。索引签名是 不相容。类型'(((state:State,action:ActionA)=> State) | ((state:State,action:ActionB)=> State)'不可分配给 输入“ ReducerMapValue”。类型 “(状态:状态,操作:ActionB)=>状态”不可分配给类型 “ ReducerMapValue”。输入'(state: 状态,操作:ActionB)=>“状态”不可分配给类型 '减速器'。参数类型 “动作”和“动作”不兼容。类型 无法将“动作”分配给类型“动作B”。 属性“有效负载”的类型不兼容。键入“事物| undefined”不能分配给类型“ Thing [] |未定义”。类型“事物”丢失 类型'Thing []'的以下属性:length,pop,push, concat,还有28个。重载3之3,'((reducerMap: ReducerMapMeta,initialState: 状态,选项?:选项|未定义): ReduxCompatibleReducerMeta',给了 以下错误。类型'{[x:string]:((state: 状态,操作:ActionA)=>状态)| ((状态:状态,操作:ActionB) =>状态); }”不可分配给“ ReducerMapMeta”类型的参数。指数 签名不兼容。键入'(((state:State,action: ActionA)=>状态)| (((state:State,action:ActionB)=> State)'是 不可分配给类型'ReducerMapMeta | ReducerMeta | ReducerNextThrowMeta'。 类型'((状态:状态,操作:ActionB)=>状态'不能分配给类型'ReducerMapMeta | ReducerMeta | ReducerNextThrowMeta'。 类型“(状态:状态,操作:ActionB)=>状态”不能分配给类型“ ReducerMeta”。 参数“ action”和“ action”的类型不兼容。类型“ ActionMeta”不可分配给类型“ ActionB”。种类 属性“有效负载”不兼容。类型 '东西| undefined”不能分配给类型“ Thing [] |未定义”。 类型“事物”未分配

可以键入“ Thing []”。

0 个答案:

没有答案