Я работаю с API, который имеет фиксированную, непротиворечивую структуру ответов: это всегда объект, у которого есть свойство data
.Поскольку это очень утомительно и слишком явно для постоянного отображения данных в запросах RxJS (или эффектов ngrx), я решил ввести пользовательский оператор RxJS, который собирает данные и применяет необязательный обратный вызов.
Но теперь некоторые измои эффекты жалуются на информацию о типе (например: property x doesn't exist on type {}
), поэтому я предполагаю, что моих усилий по правильной защите ввода-вывода оператора недостаточно:
export function mapData<T, R>(callback?: (T) => R) {
return (source: Observable<T>) => source.pipe(
map(value => value['data'] as R), // isn't that an equivalent of `pluck<T>('data')` ?
map(value => typeof callback === 'function' ? callback(value) : value as R),
);
}
Пример эффекта ngrx спроблемы охранника типа:
switchMap(() => this.api.getData().pipe(
mapData(),
mergeMap(data => [
new actions.DataSuccessAction({ id: data.id }), // <-- id does not exist on type {}
new actions.SomeOtherAction(data),
]),
catchError(err => of(new actions.DataFailureAction(err))),
)),
Что, конечно же, исчезнет, когда я приведу это явным образом:
mapData<any, IMyData>(....),
Мне бы хотелось услышать, является ли это правильным способом TypeScript дляделать вещи.