У меня есть следующий код, который использует NgRx Effect
:
import { Injectable } from "@angular/core";
import { Actions, ofType, Effect } from "@ngrx/effects";
import { SearchContactService } from "../../search-contact.service";
import { Action } from "@ngrx/store";
import { Observable, of } from "rxjs";
import { SearchActionTypes, SearchTagResultAction, SearchKeywordResultAction } from "../actions/search.action";
import { mergeMap, map, debounceTime, distinctUntilChanged, filter } from "rxjs/operators";
@Injectable()
export class SearchEffects {
@Effect()
enterSearch$: Observable<Action> = this.actions$.pipe(
ofType(SearchActionTypes.SearchEnterKeyword),
filter(action => { return action && action.payload.keyword && action.payload.keyword.length }),
debounceTime(300),
distinctUntilChanged(),
mergeMap(action => {
let keyword = action.payload.keyword as string;
if (keyword.startsWith("#")) {
return this.searchContactService.searchTag(keyword.substr(1))
.pipe(
map(data => new SearchTagResultAction({
tags: data,
}))
);
} else {
return this.searchContactService.searchContact(keyword)
.pipe(
map(data => new SearchKeywordResultAction({
contacts: data,
}))
);
}
}),
);
constructor(
private searchContactService: SearchContactService,
private actions$: Actions) {
}
}
Код компилируется и хорошо работает в браузере.Однако довольно досадно, что VS показывает ошибку при каждом параметре action
.
У кого-нибудь есть эта проблема?Как я могу решить это?
РЕДАКТИРОВАТЬ: Я обнаружил, что это из-за метода ofType
, а не сам pipe
.До сих пор не могу понять, почему.
РЕДАКТИРОВАТЬ 2: После добавления типа для ofType
еще одна ошибка присваивания.В браузере он все еще компилируется и запускается.Я даже пытался SearchActions
(мой тип действия объединения), та же проблема все еще.
РЕДАКТИРОВАТЬ: нашел решение: использовать явный тип на mergeMapтоже:
mergeMap<SearchEnterKeywordAction, SearchActions>(action => {