Я новичок в машинописи, но понял, что знаю, как это решить.
В редукторе мы обычно импортируем типы действий, это выглядит так:
// actions.ts
import { action } from 'typesafe-actions';
import actionTypes from './actionTypes';
export const someAction = (data) = action(
actionTypes.SOME_ACTION_TYPE,
{ data },
);
// reducer.ts
import { ActionType } from 'typesafe-actions';
import { StateSlice } from './types';
import * as actions from './actions';
const initialState: StateSlice = { ... };
const reducer = (state = initialState, action: ActionType<typeof actions>): StateSlice => {
...
};
Таким образом, чтобы обновить это, чтобы принимать действия, которые были изменены промежуточным программным обеспечением с избыточной логикой, мы должны сообщить машинописному шрифту, что тип расширен.Это выглядит так:
// actions.ts
import { action } from 'typesafe-actions';
import actionTypes from './actionTypes';
export const someAction = (data) = action(
actionTypes.SOME_ACTION_TYPE,
{ data },
);
// reducer.ts
import { ActionType } from 'typesafe-actions';
import { StateSlice, SOME_TYPE } from './types';
import * as actions from './actions';
type OriginalAction = ActionType<typeof actions.someAction>;
interface MutatedAction1 extends OriginalAction {
payload: OriginalAction['payload'] & {
thingWeAddedInReduxLogic: SOME_TYPE;
};
}
// repeat for other actions, then use a union type like this
type MutatedActionType = MutatedAction1 | MutatedAction2 | ... ;
const initialState: StateSlice = { ... };
const reducer = (state = initialState, action: MutatedActionType): StateSlice => {
...
};
Это сокращенная версия реального кода, который мне удалось заставить работать.Надеюсь, это кому-то помогло.