Skip to content

Commit 07f9baf

Browse files
committed
fix(core): CHECKOUT-2450 Fix Reducer and Action type definition
1 parent 9cc179a commit 07f9baf

10 files changed

+26
-26
lines changed

src/action.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
export default interface Action<TPayload = any, TMeta = any> {
2-
type: string;
1+
export default interface Action<TPayload = any, TMeta = any, TType extends string = string> {
2+
type: TType;
33
error?: boolean;
44
meta?: TMeta;
55
payload?: TPayload;

src/combine-reducers.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ describe('combineReducers()', () => {
77
const state = { foo: 'FOO', bar: 'BAR' };
88
const action = { type: 'ACTION' };
99

10-
const reducer = combineReducers({
10+
const reducer = combineReducers<{ foo: string, bar: string }>({
1111
foo: fooReducer,
1212
bar: barReducer,
1313
});

src/combine-reducers.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ import { assign } from 'lodash';
22
import Action from './action';
33
import Reducer from './reducer';
44

5-
export default function combineReducers<TState, TAction extends Action>(
5+
export default function combineReducers<TState, TAction extends Action = Action>(
66
reducers: ReducerMap<TState, TAction>
77
): Reducer<TState, TAction> {
88
return (state, action) =>
9-
Object.keys(reducers).reduce((result: TState, key) => {
9+
Object.keys(reducers).reduce((result, key) => {
1010
const reducer = reducers[key as keyof TState];
1111
const currentState = state ? state[key as keyof TState] : undefined;
1212
const newState = reducer(currentState, action);
@@ -16,9 +16,9 @@ export default function combineReducers<TState, TAction extends Action>(
1616
}
1717

1818
return assign({}, result, { [key]: newState });
19-
}, state);
19+
}, state || {} as TState);
2020
}
2121

22-
export type ReducerMap<TState, TAction extends Action> = {
23-
[Key in keyof TState]: Reducer<TState[Key] | undefined, TAction>;
22+
export type ReducerMap<TState, TAction extends Action = Action> = {
23+
[Key in keyof TState]: Reducer<TState[Key], TAction>;
2424
};

src/compose-reducers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { curryRight, flowRight } from 'lodash';
22
import Action from './action';
33
import Reducer from './reducer';
44

5-
export default function composeReducers<TState, TAction extends Action>(
5+
export default function composeReducers<TState, TAction extends Action = Action>(
66
...reducers: Array<Reducer<Partial<TState>, TAction>>
77
): Reducer<TState, TAction> {
88
return (state, action) =>

src/create-action.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import { omitBy } from 'lodash';
22
import Action from './action';
33

4-
export default function createAction<TPayload, TMeta>(
5-
type: string,
4+
export default function createAction<TPayload, TMeta, TType extends string>(
5+
type: TType,
66
payload?: TPayload,
77
meta?: TMeta
8-
): Action<TPayload, TMeta> {
8+
): Action<TPayload, TMeta, TType> {
99
if (typeof type !== 'string' || type === '') {
1010
throw new Error('`type` must be a string');
1111
}

src/create-data-store.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ import combineReducers, { ReducerMap } from './combine-reducers';
33
import DataStore, { DataStoreOptions } from './data-store';
44
import Reducer from './reducer';
55

6-
export default function createDataStore<TState, TAction extends Action, TTransformedState = TState>(
7-
reducer: Reducer<Partial<TState>, TAction> | ReducerMap<Partial<TState>, TAction>,
6+
export default function createDataStore<TState, TAction extends Action = Action, TTransformedState = TState>(
7+
reducer: Reducer<TState, TAction> | ReducerMap<TState, TAction>,
88
initialState?: Partial<TState>,
99
options?: Partial<DataStoreOptions<TState, TAction, TTransformedState>>
1010
): DataStore<TState, TAction, TTransformedState> {

src/create-error-action.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import Action from './action';
22
import createAction from './create-action';
33

4-
export default function createErrorAction<TPayload, TMeta>(
5-
type: string,
4+
export default function createErrorAction<TPayload, TMeta, TType extends string>(
5+
type: TType,
66
payload?: TPayload,
77
meta?: TMeta
8-
): Action<TPayload, TMeta> {
8+
): Action<TPayload, TMeta, TType> {
99
return {
1010
...createAction(type, payload, meta),
1111
error: true,

src/data-store.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import 'rxjs/add/operator/mergeMap';
2626
import 'rxjs/add/operator/scan';
2727

2828
export default class DataStore<TState, TAction extends Action = Action, TTransformedState = TState> implements ReadableDataStore<TTransformedState>, DispatchableDataStore<TTransformedState, TAction> {
29-
private _reducer: Reducer<Partial<TState>, TAction>;
29+
private _reducer: Reducer<TState, TAction>;
3030
private _options: DataStoreOptions<TState, TAction, TTransformedState>;
3131
private _notification$: Subject<TTransformedState>;
3232
private _dispatchers: { [key: string]: Dispatcher<TAction> };
@@ -35,7 +35,7 @@ export default class DataStore<TState, TAction extends Action = Action, TTransfo
3535
private _errors: { [key: string]: Subject<Error> };
3636

3737
constructor(
38-
reducer: Reducer<Partial<TState>, TAction>,
38+
reducer: Reducer<TState, TAction>,
3939
initialState: Partial<TState> = {},
4040
options?: Partial<DataStoreOptions<TState, TAction, TTransformedState>>
4141
) {
@@ -46,7 +46,7 @@ export default class DataStore<TState, TAction extends Action = Action, TTransfo
4646
actionTransformer: noopActionTransformer,
4747
...options,
4848
};
49-
this._state$ = new BehaviorSubject(this._options.stateTransformer(initialState));
49+
this._state$ = new BehaviorSubject(this._options.stateTransformer(initialState as TState));
5050
this._notification$ = new Subject();
5151
this._dispatchers = {};
5252
this._dispatchQueue$ = new Subject();
@@ -57,7 +57,7 @@ export default class DataStore<TState, TAction extends Action = Action, TTransfo
5757
.filter((action) => !!action.type)
5858
.scan(
5959
(states, action) => this._transformStates(states, action),
60-
{ state: initialState, transformedState: this._state$.getValue() }
60+
{ state: initialState as TState, transformedState: this._state$.getValue() }
6161
)
6262
.map(({ transformedState }) => transformedState)
6363
.distinctUntilChanged(isEqual)
@@ -110,9 +110,9 @@ export default class DataStore<TState, TAction extends Action = Action, TTransfo
110110
}
111111

112112
private _transformStates(
113-
states: StateTuple<Partial<TState>, TTransformedState>,
113+
states: StateTuple<TState, TTransformedState>,
114114
action: TAction
115-
): StateTuple<Partial<TState>, TTransformedState> {
115+
): StateTuple<TState, TTransformedState> {
116116
const { state, transformedState } = states;
117117

118118
try {
@@ -207,7 +207,7 @@ export default class DataStore<TState, TAction extends Action = Action, TTransfo
207207
export interface DataStoreOptions<TState, TAction, TTransformedState> {
208208
shouldWarnMutation: boolean;
209209
actionTransformer: (action: Observable<TAction>) => Observable<TAction>;
210-
stateTransformer: (state: Partial<TState>) => TTransformedState;
210+
stateTransformer: (state: TState) => TTransformedState;
211211
}
212212

213213
interface StateTuple<TState, TTransformedState> {

src/dispatchable-data-store.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import Action from './action';
33
import ThunkAction from './thunk-action';
44
import ReadableDataStore from './readable-data-store';
55

6-
export default interface DispatchableDataStore<TTransformedState, TAction extends Action> extends ReadableDataStore<TTransformedState> {
6+
export default interface DispatchableDataStore<TTransformedState, TAction extends Action = Action> extends ReadableDataStore<TTransformedState> {
77
dispatch: <TDispatchAction extends TAction>(
88
action: DispatchableAction<TDispatchAction, TTransformedState>,
99
options?: DispatchOptions

src/reducer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import Action from './action';
22

3-
type Reducer<TState, TAction extends Action> = (state: TState, action: TAction) => TState;
3+
type Reducer<TState, TAction extends Action = Action> = (state: TState | undefined, action: TAction) => TState;
44

55
export default Reducer;

0 commit comments

Comments
 (0)