Angular 5、IONIC 3:'void'无法赋值给'Observable<Post[]>'及JSON映射疑问
解决Angular 5 + Ionic 3中Type 'void'无法赋值给Observable<Post[]>的错误
嘿,这个问题我熟!你碰到的类型不匹配错误,本质原因很简单——你的数据服务(DataProvider)里的方法没有正确返回**Observable<Post[]>**类型的对象,反而返回了void,自然和组件里期望的类型对不上。
先给你拆解下:Angular 5确实已经帮我们自动把HTTP响应解析成JSON了,不用再手动写.map(res => res.json()),这点你没记错。但问题出在你服务里的请求逻辑上,大概率是你漏掉了return语句!
举个例子,假设你的DataProvider里原来的代码是这样的:
// 错误写法:没有return,方法返回值是void getPosts() { this.http.get('https://your-api-endpoint/posts'); }
这时候这个方法的返回类型默认是void,而你的组件里肯定是期望它返回Observable<Post[]>,类型检查自然就报错了。
正确的写法应该是这样:
- 先在DataProvider里明确方法的返回类型,并且return整个HTTP请求流:
import { HttpClient } from '@angular/common/http'; // Angular 5用HttpClient,不是Http import { Observable } from 'rxjs/Observable'; import { Post } from '../models/posts.interface'; @Injectable() export class DataProvider { constructor(private http: HttpClient) {} // 明确返回类型Observable<Post[]>,并且return请求结果 getPosts(): Observable<Post[]> { // Angular 5的HttpClient会自动解析JSON,直接用泛型指定返回类型即可 return this.http.get<Post[]>('https://your-api-endpoint/posts'); } }
- 如果需要在请求里加额外的操作(比如日志、错误处理),也要确保整个链式调用最后return出去:
import { catchError, tap } from 'rxjs/operators'; import { throwError } from 'rxjs/observable/throwError'; getPosts(): Observable<Post[]> { return this.http.get<Post[]>('https://your-api-endpoint/posts') .pipe( tap(posts => console.log('获取到的文章列表:', posts)), // 打印日志,不修改流 catchError(error => { console.error('获取文章出错:', error); return throwError(() => new Error('获取文章失败,请稍后重试')); // 抛出错误流 }) ); }
- 最后在组件里调用的时候,就能正常接收Observable<Post[]>了:
import { Component } from '@angular/core'; import { IonicPage } from 'ionic-angular'; import { Observable } from 'rxjs/Observable'; import { Post } from '../../models/posts.inteface'; import { DataProvider } from '../../providers/data/data'; @IonicPage() @Component({ selector: 'page-post', templateUrl: 'post.html', }) export class PostPage { posts$: Observable<Post[]>; constructor(private dataProvider: DataProvider) {} ionViewDidLoad() { this.posts$ = this.dataProvider.getPosts(); } }
核心就是一句话:确保你的数据服务方法始终返回Observable实例,不要漏掉return语句,这样类型检查就能通过了。
内容的提问来源于stack exchange,提问作者Arun Prasad E S
相关产品推荐
相关产品推荐

