Я создаю приложение React с Context API
и React Hooks
.Я пытаюсь следовать лучшим практикам.Для этого я использую Flow
и пытаюсь придерживаться его предупреждений.
У меня есть ситуация, когда после входа в систему пользователь хочет сохранить некоторые данные об этом пользователе в SessionContext
Я построил.Учитывая, что на данный момент существует только 3 фрагмента данных, и все они примитивны, я подумал, что имеет смысл иметь только одно Действие Редуктора:
export const sessionReducer = (state: SessionState, action: SessionAction) => {
switch (action.type) {
case UPDATE_SESSION_PROP: {
return {
...state,
[action.propName]: action.payload
};
}
default: {
return state;
}
}
}
Вот типы действий, которые я создал для учета3 типа данных:
export type UserEmailAction = {type: 'UPDATE_SESSION_PROP',
propName: 'currentUserEmail',
payload: string};
export type UserAccessLevelAction = {type: 'UPDATE_SESSION_PROP',
propName: 'currentUserAccessLevel',
payload: number};
export type CurrentCompanyNameAction = {type: 'UPDATE_SESSION_PROP',
propName: 'currentCompanyName',
payload: string};
В моем SessionContext
я комбинирую эти 3 типа действий следующим образом, а затем определяю тип отправки из этого:
export type SessionAction =
| UserEmailAction
| UserAccessLevelAction
| CurrentCompanyNameAction;
type Dispatch = (action: SessionAction) => void;
Есть 4 предупреждениясообщения поверх sessionReducer
в этом коде:
const [state: SessionState, dispatch: Dispatch] = useReducer(sessionReducer, defaultState);
Сообщения сродни следующему: «Невозможно позвонить useReducer
с sessionReducer
, связанным с reducer
, так как число [1] несовместимо сстрока [2] в свойстве currentCompanyName
возвращаемого значения. "
Неправильно ли я определил типы действий или Flow не достаточно умен, чтобы различать 3 шаблона?Кстати, этот подход, кажется, работает нормально при запуске.