TL; DR
Замените Object
на свой объект, где ключи - ваши ключи состояния, а значения - ваше определение редуктора: {status: Reducer<boolean, Action>}
таким образом, вы получите:
combineReducers<{status: Reducer<boolean, Action>}, Action>(...)
Длинный ответ.
Reducer<S, any>
- редуктор - это чистая функция, которая принимает текущее состояние идействие и возвращает новое состояние.Вот и все, довольно просто.И таким образом это точно описано в flow-type :
declare export type Reducer<S, A> = (state: S | void, action: A) => S
$ObjMap<O, <S>(r: Reducer<S, any>) => S>
- это более сложно, отобразить данный объект O
, вызватькаждый член (мы ожидаем, что они будут функциями) и возвращают тип.Проверьте документ , это очень мощная вещь.
Эта часть: <S>(r: Reducer<S, any>) => S
может называться extract function type
.В человеческих словах это можно сказать как -> редуктор может вернуть любой тип, верно?Итак, давайте поместим возвращенное состояние редуктора в общий <S>
, а затем поместим возвращаемый тип в этот универсальный .Мне потребовалось более 1 дня, чтобы понять, как это работает, надеюсь, в вашем случае это будет быстрее.:)
Итак, наконец: combineReducer<S, A>
- заданное состояние S
(которое является Object, и каждый член является редуктором), и действие A
возвращает объект, члены которого приводятся типом для каждого вызова члена S
.
Итак, ваша status
функция редуктора - может быть лучше описана как
Reducer<boolean, Action> //accepts boolean, Action args & return boolean
И мы можем определить состояние как:
type State = { status: Reducer<boolean, Action> };
А затем, передайте состояние для combReducer:
export default combineReducers<State, Action>({
status: ((state: boolean = true, action: Action) => {
switch (action.type) {
case 'START_SESSION':
case 'REFRESH_AUTH_SUCCEEDED':
case 'SIGN_IN_FAILED':
case 'SIGN_OUT':
return false;
default:
return state;
}
}),
});
Чтобы проверить правильность ввода, вы можете импортировать ваш редуктор и привести выражения :
const checkState = reducer({status: true}, {type: 'START_SESSION'});
(checkState.status: number); // ERROR
(checkState.status: boolean); // CORRECT
Надеюсь, это поможет.