Angular中如何通过管道与映射获取嵌套对象的MovieRatings?
解决Angular中提取用户评分的问题
你的思路方向是对的,但几个写法都存在问题,下面逐个分析并给出正确实现:
问题分析
- 你注释的第一种写法最接近正确,但存在类型不匹配问题:
getUser返回的是Observable<IUser | undefined>,当用户不存在时user?.movieRatings会是undefined,但你的方法声明返回的是Observable<IMovieRating[]>,类型不兼容。 - 未注释的
tap写法错误:tap是副作用操作符,不会修改流中的值,所以result的类型还是Observable<IUser | undefined>,和方法返回类型不符,编译器会报错。 - 第三种
forEach写法完全错误:Observable的forEach是订阅后执行的方法,返回Promise<void>,不能作为Observable返回,且语法也不符合规范。
正确实现
方案一:用户不存在时返回空数组
这种方案保证无论用户是否存在,流都会发出一个数组(空数组或用户的评分数组):
getUserRatings(userId: number): Observable<IMovieRating[]> { return this.getUser(userId).pipe( map(user => user?.movieRatings ?? []) ); }
这里用空值合并运算符??,当user为undefined时,返回空数组[],确保流的类型始终是IMovieRating[]。
方案二:仅当用户存在时返回评分数组
如果希望用户不存在时,流不发出任何值,可以用filter先过滤掉undefined的情况:
getUserRatings(userId: number): Observable<IMovieRating[]> { return this.getUser(userId).pipe( filter(user => user !== undefined), map(user => user.movieRatings) ); }
filter会跳过user为undefined的情况,后续map时可以确定user一定存在,直接访问movieRatings即可。
内容的提问来源于stack exchange,提问作者Sean Smyth
相关产品推荐
相关产品推荐

