Angular Services报错Type 'void' is not assignable to type 'Project[]'如何解决
问题原因
- 你在
ProjectService的getProjects方法中直接调用了subscribe,且没有显式设置返回值,因此该方法的返回类型默认是void,无法赋值给组件中类型为Project[]的projects变量,这是报错的直接原因。 - HTTP请求是异步操作,你不能直接通过同步赋值的方式拿到返回结果,必须在Observable的回调中处理返回数据。
修复方案
第一步:修改ProjectService代码
不要在服务内部调用subscribe,直接返回HTTP请求生成的Observable对象即可:
import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Project } from '../project'; import { Observable } from 'rxjs'; @Injectable({ providedIn: 'root' }) export class ProjectService { constructor( private http: HttpClient, ) { } // 显式声明返回类型为Observable<Project[]>,直接返回请求对象 getProjects(): Observable<Project[]> { return this.http.get<Project[]>('/api/getprojects'); } }
第二步:修改Dashboard组件代码
在组件中订阅服务返回的Observable,拿到异步返回的结果后再给projects变量赋值:
import { Component, OnInit } from '@angular/core'; import { Project } from '../project'; import { ProjectService } from '../service/project.service'; @Component({ selector: 'app-dashboard', templateUrl: './dashboard.component.html', styleUrls: ['./dashboard.component.scss'] }) export class DashboardComponent implements OnInit { constructor( private projectService: ProjectService ) { } projects!: Project[]; ngOnInit():void { this.getProjects(); } getProjects(){ // 订阅Observable,在回调中处理返回结果 this.projectService.getProjects().subscribe((response) => { console.log(response); this.projects = response; }) } }
补充说明
- 建议给所有方法显式声明返回类型,TypeScript会提前做类型校验,避免这类隐式返回的问题
- 组件中无用的
import { ThrowStmt } from '@angular/compiler';可以直接删除 - 如果需要处理请求异常,可以在
subscribe的第二个参数传入错误回调,也可以提前用RxJS的catchError操作符统一处理异常 - 不要在可复用的服务中直接调用
subscribe,会导致Observable无法复用,也不方便组件自定义处理返回结果和异常
内容的提问来源于stack exchange,提问作者Philipp
相关产品推荐
相关产品推荐

