所以我有商品搜索效果。基本上,我首先调度一个search_start动作,该动作具有用于该搜索的参数有效负载,然后效果生效,然后转到服务,然后返回响应,从而提供了产品列表。然后,我希望能够做两件事:
我遇到第二个问题,主要是因为执行switchMap且returnType为'SearchResultResponseType'意味着我现在不能执行SearchSave(action.payload)主要是因为有效载荷的类型为'SearchParameterType' 。因此,我只能执行SearchSuccess操作。
无论如何,这可以实现吗?我试图将响应类型更改为将SearchParameterType和SearchResultResponseType都作为该类型的两个属性的超级类型,并让我的productSearchService返回该超级类型,但似乎也会产生错误。没有简单的方法吗?
export class ProductSearchEffects {
@Effect() startSearch$: Observable<
ActionWithPayload<SearchResultResponseType> | Observable<Action>
> = this.actions$.pipe(
ofType<SearchStart>(ProductSearchActions.SEARCH_START),
mergeMap(action =>
this.productSearchService.fetchSearchResults(action.payload)
.pipe(
// if successful then save search and dispatch search success
switchMap((data: SearchResultResponseType) => [
new SearchSave(action.payload),
new SearchSuccess(data),
]),
catchError(() => of(new SearchFail())),
),
),
);
答案 0 :(得分:2)
我认为您不需要显式定义返回类型。
否则,您可以使用mergeMap
进行操作。我看到您将switchMap
和mergeMap
颠倒了,您只需要颠倒位置,就可以了。
export class ProductSearchEffects {
@Effect() startSearch$ = this.actions$.pipe(
ofType<SearchStart>(ProductSearchActions.SEARCH_START),
switchMap(action =>
this.productSearchService.fetchSearchResults(action.payload)
.pipe(
mergeMap((data: SearchResultResponseType) => [
new SearchSave(action.payload),
new SearchSuccess(data),
]),
catchError(() => of(new SearchFail())),
),
),
);
答案 1 :(得分:0)
我已经看到并亲自采用的常见做法是为您的动作加上别名,即type SearchAction = SearchStart | SearchSave | SearchSuccess | SearchFail'
,然后效果的返回类型为Observable<SearchAction>
。然后TypeScript将验证别名是否覆盖了所有返回的动作。