Отказ от ответственности: я использую электронный шаблон от https://github.com/iRath96/electron-react-typescript-boilerplate
Там есть несколько хороших кодов создателей действий (скопируйте вставку из шаблона для лучшего контекста:)
import { Action } from 'redux'
export interface IAction extends Action {}
export interface IActionWithPayload<T> extends IAction {
readonly payload: T
}
interface IActionCreator<T> {
readonly type: string
(payload: T): IActionWithPayload<T>
test(action: IAction): action is IActionWithPayload<T>
}
interface IActionCreatorVoid {
readonly type: string
(): IAction
test(action: IAction): action is IAction
}
export const actionCreator = <T>(type: string): IActionCreator<T> =>
Object.assign((payload: T): IActionWithPayload<T> => ({ type, payload }), {
type,
test(action: IAction): action is IActionWithPayload<T> {
return action.type === type
},
})
export const actionCreatorVoid = (type: string): IActionCreatorVoid =>
Object.assign((): IAction => ({ type }), {
type,
test(action: IAction): action is IAction {
return action.type === type
},
})
Итак, для создания новых действий я просто делаю:
export const fetchAllBackgroundsPending = actionCreatorVoid('FETCH_BACKGROUNDS_PENDING')
export const fetchAllBackgroundsSuccess = actionCreator<IBackground[]>('FETCH_BACKGROUNDS_SUCCESS')
export const fetchAllBackgroundsRejected = actionCreator<IAPIError>('FETCH_BACKGROUNDS_REJECTED')
И это работает просто отлично: мой action.payload
теперь набран.
Однако, если я использую более 2 веток в моем редукторе, я получаю тип «никогда» в моей полезной нагрузке:
const backgroundsReducer = (
state: IBackgroundsState = initialState,
action: IAction
): IBackgroundsState => {
if (fetchAllBackgroundsPending.test(action)) {
return {
...state,
isCollectionLoading: true,
}
}
if (fetchAllBackgroundsSuccess.test(action)) {
return {
...state,
// action has a type of never!
byId: mergeById(state, action.payload)
}
}
return state
}
Насколько я могу судить по документам, TS намекает мне, что ветвь кода никогда не запустится, но это не так: если я поставлю console.log
, я могу наблюдать за ними! Итак, похоже, что TS совершает ошибку ... или я?
Я понимаю, что приведенный здесь код не похож на минимальный пример, поэтому, если он недостаточно ясен, пожалуйста, дайте мне знать, и я постараюсь найти минимальный репозиторий, иллюстрирующий эту проблему. Любая помощь приветствуется!