Reputation: 530
I have a simple goal of creating an observable that emits a list of all the countries in the world. The type of the observable is Country[]
, i.e. the store value is typed as an array of objects. However, when passed to switchMap
, it magically gets converted into type Country
. I have no idea what causes this behavior and if it is not, by chance, on my side. Here is the function in question:
public getAllCountries(): Observable<Country[]> {
const getAppState = createFeatureSelector<ServicesState>('services');
const getCountries = createSelector( getAppState, (state: ServicesState): Country[] => state.countries);
// as you can see, this is the NGRX store slice that must be of type Observable<Country[]>
const countriesFromStore$ = this.store.pipe(select(getCountries));
return countriesFromStore$.pipe(
// this is the switchMap that causes the error
switchMap( countries => {
// this is the return statement that somehow converts an array of objects into a single object??
if (countries) { return countries; }
const countriesFromServer$: Observable<Country[]> = this.http.get<FilteredArrayResponse<Country>>
(this.baseUrl, this.config.httpGetJsonOptions).pipe(
tap( result => this.store.dispatch( new LoadCountriesAction(result.data)) ),
map( result => result.data)
);
return countriesFromServer$; })
);
}
In case you have questions :
FilteredArrayResponse
is a generic interface with data
attribute actually containing the arrayType 'Observable<Country | Country[]>' is not assignable to type 'Observable<Country[]>'.
switchMap
confuses an Observable of Arrays with an Array of Observables...result.data
is always an arraymap
family exhibit the same behaviourUpvotes: 0
Views: 1133
Reputation: 18809
Try returning of(countries)
in the switchMap
(import { of } from 'rxjs';
). I think that should fix it. The switchMap
needs to switch to an Observable
.
import { of } from 'rxjs';
...
switchMap((countries: Country[]) => {
if (countries) {
return of(countries);
}
....
})
Upvotes: 5