У меня есть простая цель - создать наблюдаемую систему, которая выдаст список всех стран мира. Тип наблюдаемой - Country[]
, т.е. значение хранилища вводится в виде массива объектов. Однако, когда он передан в switchMap
, он волшебным образом преобразуется в тип Country
. Я понятия не имею, что вызывает такое поведение, и если оно случайно не на моей стороне. Вот рассматриваемая функция:
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$; })
);
}
Если у вас есть вопросы:
FilteredArrayResponse
- это обобщенный c интерфейс с атрибутом data
, фактически содержащий массив - Полное сообщение об ошибке:
Type 'Observable<Country | Country[]>' is not assignable to type 'Observable<Country[]>'.
- Я предполагаю, что каким-то образом
switchMap
путает Observable of Arrays с Array of Observables ... - Тип возврата
result.data
всегда является массивом - Другие операторы из семейства
map
демонстрируют аналогичное поведение