我正在使用一个具有固定、一致的响应结构的 API:它始终是一个具有data
属性的对象。由于在 RxJS 请求(或 ngrx 效果)中不断映射数据非常烦人且过于明确,因此我决定引入一个自定义 RxJS 操作符来提取数据并应用可选的回调。
但现在我的一些效果抱怨类型信息(如property x doesn't exist on type {}
:),所以我想我努力正确地对操作员的 I/O 进行类型保护是不够的:
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 做事方式。