Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 7875319

Browse files
feat(state): add default transform function to select
* feat: default transform function for select
1 parent d70dc81 commit 7875319

File tree

4 files changed

+27
-12
lines changed

4 files changed

+27
-12
lines changed

libs/state/selections/src/lib/operators/select.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ export function select<T, A, B, C, D, E>(
9999
*/
100100
export function select<T extends object, K extends keyof T, R>(
101101
keys: K[],
102-
fn: (slice: PickSlice<T, K>) => R,
102+
fn?: (slice: PickSlice<T, K>) => R,
103103
keyCompareMap?: KeyCompareMap<Pick<T, K>>
104104
): OperatorFunction<T, R>;
105105

@@ -209,7 +209,7 @@ export function select<T extends Record<string, unknown>>(
209209
| [k: string, fn: (val: unknown) => unknown]
210210
| [
211211
keys: string[],
212-
fn: (slice: unknown) => unknown,
212+
fn?: (slice: unknown) => unknown,
213213
keyCompareMap?: KeyCompareMap<T>
214214
]
215215
): OperatorFunction<T, unknown> {
@@ -219,13 +219,16 @@ export function select<T extends Record<string, unknown>>(
219219
} else if (isStringAndFunctionTupleGuard(opOrMapFn)) {
220220
return state$.pipe(stateful(map((s) => opOrMapFn[1](s[opOrMapFn[0]]))));
221221
} else if (isStringArrayFunctionAndOptionalObjectTupleGuard(opOrMapFn)) {
222-
return state$.pipe(
223-
selectSlice<T & object, keyof T>(
224-
opOrMapFn[0] as (keyof T)[],
225-
opOrMapFn[2]
226-
),
227-
stateful(map(opOrMapFn[1]))
228-
);
222+
const selectedState$: Observable<PickSlice<T & object, keyof T>> =
223+
state$.pipe(
224+
selectSlice<T & object, keyof T>(
225+
opOrMapFn[0] as (keyof T)[],
226+
opOrMapFn[2] as KeyCompareMap<{ [P in keyof T]: (T & object)[P] }>
227+
)
228+
);
229+
return typeof opOrMapFn[1] === 'undefined'
230+
? selectedState$
231+
: selectedState$.pipe(stateful(map(opOrMapFn[1])));
229232
} else if (isStringArrayGuard(opOrMapFn)) {
230233
return state$.pipe(
231234
stateful(

libs/state/selections/src/lib/utils/guards.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ export function isStringArrayFunctionAndOptionalObjectTupleGuard<R>(
6565
): op is [strs: string[], fn: (val: any) => R, obj?: object] {
6666
return (
6767
isStringArrayGuard(op[0] as any) &&
68-
typeof op[1] === 'function' &&
68+
(typeof op[1] === 'function' || typeof op[1] === 'undefined') &&
6969
(op[2] === undefined || typeof op[2] === 'object')
7070
);
7171
}

libs/state/spec/rx-state.service.spec.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,18 @@ describe('RxStateService', () => {
262262
});
263263
});
264264

265+
it('should return mapped slice with default function if no one provided', () => {
266+
testScheduler.run(({ expectObservable }) => {
267+
const state = setupState({ initialState: initialPrimitiveState });
268+
expectObservable(state.select(['num', 'str'])).toBe('s', {
269+
s: {
270+
num: 42,
271+
str: 'str',
272+
},
273+
});
274+
});
275+
});
276+
265277
it('should return mapped slice on select with keys, function and key compare map', () => {
266278
testScheduler.run(({ expectObservable }) => {
267279
const state = setupState({

libs/state/src/lib/rx-state.service.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -694,7 +694,7 @@ export class RxState<State extends object>
694694
*/
695695
select<Key extends keyof State, Value>(
696696
keys: Key[],
697-
fn: (slice: PickSlice<State, Key>) => Value,
697+
fn?: (slice: PickSlice<State, Key>) => Value,
698698
keyCompareMap?: KeyCompareMap<Pick<State, Key>>
699699
): Observable<Value>;
700700

@@ -813,7 +813,7 @@ export class RxState<State extends object>
813813
| [k: string, fn: (val: unknown) => unknown]
814814
| [
815815
keys: string[],
816-
fn: (slice: unknown) => unknown,
816+
fn?: (slice: unknown) => unknown,
817817
keyCompareMap?: KeyCompareMap<State>
818818
]
819819
): Observable<State | Return> {

0 commit comments

Comments
 (0)