Несовместимые типы действий в редукторе - PullRequest
0 голосов
/ 17 января 2020

В моем приложении есть несколько различных действий, которые могут влиять или не влиять на одну и ту же часть состояния. Чтобы упростить пример, я создал этот небольшой код:


// @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: State, options ?: Options | undefined): ReduxCompatibleReducer', вызвала следующую ошибку. Аргумент типа '{[x: строка]: ((состояние: состояние, действие: действие A) => состояние) | ((состояние: состояние, действие: действиеB) => состояние); } 'нельзя назначить параметру типа' ReducerMap '. Подписи индекса несовместимы. Тип '((состояние: состояние, действие: действие A) => состояние) | ((state: State, action: ActionB) => State) 'нельзя назначить типу' ReducerMapValue '. Тип '(state: State, action: ActionA) => State' нельзя назначить типу 'ReducerMapValue'. Тип '(state: State, action: ActionA) => State' нельзя назначить типу 'Reducer'. Типы параметров «действие» и «действие» несовместимы. Тип «Action» не может быть назначен типу «ActionA». Типы свойств «полезная нагрузка» несовместимы. Свойство id отсутствует в типе State, но требуется в типе Thing. Перегрузка 2 из 3, '(reducerMap: ReducerMap, initialState: State, options ?: Options | undefined): ReduxCompatibleReducer', вызвала следующую ошибку. Аргумент типа '{[x: строка]: ((состояние: состояние, действие: действие A) => состояние) | ((состояние: состояние, действие: действиеB) => состояние); } 'нельзя назначить параметру типа' ReducerMap '. Подписи индекса несовместимы. Тип '((состояние: состояние, действие: действие A) => состояние) | ((state: State, action: ActionB) => State) 'нельзя назначить типу' ReducerMapValue '. Тип '(state: State, action: ActionB) => State' нельзя назначить типу 'ReducerMapValue'. Тип '(state: State, action: ActionB) => State' нельзя назначить типу 'Reducer'. Типы параметров «действие» и «действие» несовместимы. Тип «Action» не может быть назначен типу «ActionB». Типы свойств «полезная нагрузка» несовместимы. Тип "Вещи | undefined 'нельзя назначить типу' Thing [] | не определено. Типу «Вещи» не хватает следующих свойств из типа «Вещи []»: длина, поп, пу sh, конкат и еще 28. Перегрузка 3 из 3, '(reducerMap: ReducerMapMeta, initialState: State, options ?: Options | undefined): ReduxCompatibleReducerMeta', вызвала следующую ошибку. Аргумент типа '{[x: строка]: ((состояние: состояние, действие: действие A) => состояние) | ((состояние: состояние, действие: действиеB) => состояние); } 'нельзя назначить параметру типа' ReducerMapMeta '. Подписи индекса несовместимы. Тип '((состояние: состояние, действие: действие A) => состояние) | ((state: State, action: ActionB) => State) 'нельзя назначить типу' ReducerMapMeta | РедукторМета | ReducerNextThrowMeta. Тип '(state: State, action: ActionB) => State' нельзя назначить типу 'ReducerMapMeta | РедукторМета | ReducerNextThrowMeta. Тип '(state: State, action: ActionB) => State' нельзя назначить типу 'ReducerMeta'. Типы параметров «действие» и «действие» несовместимы. Тип «ActionMeta» нельзя назначить типу «ActionB». Типы свойств «полезная нагрузка» несовместимы. Тип "Вещи | undefined 'нельзя назначить типу' Thing [] | не определено. Типу «Вещь» нельзя присвоить

типу «Вещь []».

1 Ответ

0 голосов
/ 17 января 2020

Я думаю, что это должно работать:

const reducer = handleActions({
    [someActionA.type]: (state: State, action: Action<State>) => state,
    [someActionA.type]: (state: State, action: Action<State>) => state,
}, {things: []});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...