我查看了RxJs文档并对此进行了搜索,但不能(令人惊讶地)找到我尝试做的事情的示例。
基本上,我有两项服务。一个服务使用其他服务,需要将使用服务的响应映射到另一个类型。
Angular应用程序的示例代码:
@Injectable()
export class EmployeesService {
BASE_URL = 'http://foo.bar.com/api/getEmployees';
constructor(private http: HttpClient) {
}
get(): Observable<IEmployee[]> {
return this.http.get<IEmployee[]>(this.BASE_URL);
}
}
@Injectable()
export class MyEmployeeService {
constructor(private svc: EmployeesService) {
}
get(): Observable<IMyEmployee[]> {
return this.svc.get().map(
(employees:IEmployee[]) => employees.forEach(employee => this.mapEmployeeToMyEmployee(employee))
);
}
private mapEmployeeToMyEmployee(employee: IEmployee): IMyEmployee {
return {
... simple property mapping to transform IEmployee to IMyEmployee
};
}
}
然而,在&#34; MyEmployeeService&#34; Typescript编译器抱怨&#34;返回的表达式类型Observable(void)不能分配给Observable类型(IMyEmployee [])。
即使我要在地图操作中添加退货声明,我仍然会得到同样的抱怨。我在这里做错了什么?
答案 0 :(得分:3)
这是你的单行lambda:
(employees:IEmployee[]) => employees.forEach(employee => this.mapEmployeeToMyEmployee(employee))
employees.forEach(...)
返回undefined
。由于您使用的格式为(...)=>...
而不是(...)=>{...}
,因此lambda会返回单个语句的值(undefined
)。
将其更改为:
(employees:IEmployee[]) => employees.map(employee => this.mapEmployeeToMyEmployee(employee))
map
与forEach
类似,不同之处在于它根据返回的值employee => this.mapEmployeeToMyEmployee(employee)
构建新数组。