Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork1.1k
Description
Hello, I work on a typescript react redux app using typesafe-actions. Recently, compiling / typechecking takes a lot of time (around 180s) (the app also requires more memory recently >8GB, but we fixed this using craco, and is not a problem anymore). The main section that I identified that takes a lot of time is theActionType<typeof RootAction>
(commenting this line will generate errors, but will reduce the compile time to ~10s).
The problem seems to be when infering all action types on the RootAction, it seems to be an union of all types from all actions.
The codebase has:
- 150 actions (all of them typed createAsyncAction)
- 150 epics (1 for each action)
- ~300 handleAction functions
The setup is as follows:
Action:
export const fetchCurrentUserAsync = createAsyncAction( 'FETCH_USER_DATA_REQUEST', 'FETCH_USER_DATA_SUCCESS', 'FETCH_USER_DATA_FAILURE', 'FETCH_USER_DATA_IDLE',)<string, User, string, null>();
Epic:
export const fetchCurrentUserData: EpicFunction = (action$, state$, { api }) => action$.pipe( filter(isActionOf(fetchCurrentUserAsync.request)), switchMap(action => from(api.account.fetchCurrentUserData(action.payload)).pipe( map(fetchCurrentUserAsync.success), catchError(error => handleError(error, fetchCurrentUserAsync)), ), ), );
Reducer:
export const user = createReducer({} as User) .handleAction(fetchCurrentUserAsync.success, (state, action) => { return {...state, ...action.payload}, }, }; })
Reducers are merged usingcombineReducer
, except from this is when merging reducers into RootReducer, where the setup is as follows (this might not be the best approach, but AFAIK this shouldn't be the main problem ):
const reducerWrapper = (reducer: any) => { return (state: any, action: any) => { if (action.type === 'RESET_SESSION') { state = undefined; } return reducer(state, action); };};const rootReducer = { account: reducerWrapper(accountReducer), ...};
Action / State types:
import { StateType, ActionType } from 'typesafe-actions';import RootReducer from '../redux/store/root-reducer';import RootAction from '../redux/store/root-action';declare module 'typesafe-actions' { export type RootState = StateType<typeof RootReducer>; export type RootAction = ActionType<typeof RootAction>; export type Services = typeof import('./index').default; interface Types { RootAction: RootAction; }}
My solution would be to remove typechecking with RootAction and add the types by hand for each.handleAction
, but this is a workaround, not a fix. Do you have any ideas what how to fix that long compilation time on RootAction?