New to typescript + redux ecosystem here.
How do I properly encapsulate type information into async actions when using redux-actions, redux-thunk and redux-promise-middleware in TypeScript?
An example of authentication:
/* actions */
const login = createAction(LOGIN, authService.login);
/* authService */
async function login(payload: LoginPayload): Promise<LoginResponse> {
// ... authenticate here.
}
Since I'm using redux-promise-middleware, the actions LOGIN_PENDING, LOGIN_FULFILLED/LOGIN_REJECTED are dispatched automatically. How do I create types for these such that the reducer can figure out what action object it's dealing with?
Since redux-actions follows FSA, _FULFILLED should have action.payload. _REJECTED should have action.error
/* reducer */
function loginReducer(state: AppState, action: AuthAction) {
switch (action.type) {
case LOGIN_FULFILLED:
// action.payload should be defined as LoginResponse object here.
// action.error shouldnt be present.
case LOGIN_REJECTED:
// action.error should be defined
}
}
How would I go about creating the AuthAction type? I'm guessing it should be a union type of each of the individual action types (which can be union types on their own). redux-actions also provides Action and BaseAction types for this.