Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 50f69ff

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

File tree

1 file changed

+25
-8
lines changed
Filter options

1 file changed

+25
-8
lines changed

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

Copy file name to clipboardExpand all lines: libs/state/src/lib/rxjs/operators/selectSlice.ts
+25-8Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.