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

Skip to content

Commit 50f69ff

Browse files
committed
feat(state): improve DX by logging undefined keys in selectSlice
1 parent 1510339 commit 50f69ff

File tree

1 file changed

+25
-8
lines changed

1 file changed

+25
-8
lines changed

libs/state/src/lib/rxjs/operators/selectSlice.ts

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { KeyCompareMap } from '../interfaces';
22
import { Observable, OperatorFunction } from 'rxjs';
3-
import { filter, map } from 'rxjs/operators';
3+
import { filter, map, tap } from 'rxjs/operators';
44
import { distinctUntilSomeChanged } from './distinctUntilSomeChanged';
5+
import { isDevMode } from '@angular/core';
56

67
/**
78
* @description
@@ -82,6 +83,13 @@ export function selectSlice<T extends object, K extends keyof T>(
8283
): OperatorFunction<T, PickSlice<T, K>> {
8384
return (o$: Observable<T>): Observable<PickSlice<T, K>> =>
8485
o$.pipe(
86+
tap((state) => {
87+
if (isDevMode() && state === undefined) {
88+
console.warn(
89+
'@rx-angular/state#selectSlice WARNING: state is undefined'
90+
);
91+
}
92+
}),
8593
filter((state) => state !== undefined),
8694
map((state) => {
8795
// forward null
@@ -104,20 +112,29 @@ export function selectSlice<T extends object, K extends keyof T>(
104112
// {str: undefined} => state.select(selectSlice(['str'])) => no emission
105113
// {str: 'test', foo: undefined } => state.select(selectSlice(['foo'])) => no emission
106114
if (definedKeys.length < keys.length) {
115+
if (isDevMode()) {
116+
const undefinedKeys = keys.filter((k) => !definedKeys.includes(k));
117+
console.warn(
118+
`@rx-angular/state#selectSlice WARNING: undefined value(s) of selected key(s): "${undefinedKeys.join(
119+
'", "'
120+
)}" selectSlice operator will return undefined`
121+
);
122+
}
107123
return undefined;
108124
}
109125

110126
// create the selected slice
111-
return definedKeys
112-
.reduce((vm, key) => {
113-
vm[key] = state[key];
114-
return vm;
115-
}, {} as PickSlice<T, K>);
127+
return definedKeys.reduce((vm, key) => {
128+
vm[key] = state[key];
129+
return vm;
130+
}, {} as PickSlice<T, K>);
116131
}),
117132
filter((v) => v !== undefined),
118133
distinctUntilSomeChanged(keys, keyCompareMap)
119134
);
120135
}
121136

122-
type PickSlice<T extends object, K extends keyof T> = Pick<T,
123-
{ [I in K]: I }[K]>;
137+
type PickSlice<T extends object, K extends keyof T> = Pick<
138+
T,
139+
{ [I in K]: I }[K]
140+
>;

0 commit comments

Comments
 (0)