0

我有一个简单的目标,即创建一个可观察到的可发出世界上所有国家/地区列表的对象。observable 的类型是Country[],即存储值被键入为对象数组。但是,当传递给 时switchMap,它会神奇地转换为 type 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是一个通用接口,其data属性实际上包含数组
  • 完整的错误信息是Type 'Observable<Country | Country[]>' is not assignable to type 'Observable<Country[]>'.
  • 我的猜测是,它以某种方式switchMap将 Observable 的数组与 Observable 的数组混淆了......
  • 的返回类型result.data始终是数组
  • 家庭中的其他操作员map表现出相同的行为
4

1 回答 1

3

尝试of(countries)switchMap( import { of } from 'rxjs';) 中返回。我认为这应该解决它。switchMap需要切换Observable到.

import { of } from 'rxjs';
...
switchMap((countries: Country[]) => {
  if (countries) {
    return of(countries);
  }
  ....
})
于 2020-03-04T13:05:30.840 回答