В моем приложении есть несколько различных действий, которые могут влиять или не влиять на одну и ту же часть состояния. Чтобы упростить пример, я создал этот небольшой код:
// @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 [] | не определено. Типу «Вещь» нельзя присвоить
типу «Вещь []».