Angular6调用CoreService.query报错TS2339的原因排查
错误原因及解决方案:error TS2339: Property 'query' does not exist on type 'typeof CoreService'
这个错误的根源很清晰——你把CoreService的query方法当成了静态方法直接调用,但实际上它是一个实例方法,必须通过类的实例才能访问。
具体原因:
- 在你的调用代码中,你直接写了
CoreService.query(...),这是尝试调用类本身的方法,而不是类的实例的方法。 - Angular的服务是通过依赖注入(DI)机制来管理实例的,你的
CoreService构造函数里还注入了HttpClient和Router,这些依赖需要Angular的DI容器来提供,直接调用类的静态方法根本无法初始化这些依赖。
修复步骤:
- 在组件中注入CoreService实例:在组件的构造函数中声明
CoreService的依赖,Angular会自动帮你创建并注入实例。 - 使用注入的实例调用query方法:替换掉直接调用类的方式,改用注入的实例来调用
query。
修改后的组件代码示例:
import { Component, OnDestroy } from '@angular/core'; import { CoreService} from "./../core.service"; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; @Component({ // 这里保留你组件原有的元数据,比如selector、templateUrl等 }) export class YourComponent implements OnDestroy { ngUnsubscribe = new Subject<void>(); username: string; password: string; // 构造函数中注入CoreService实例 constructor(private coreService: CoreService) {} // 假设这是你触发登录的方法 handleLogin() { // 使用注入的实例调用query方法 this.coreService.query('login','POST',{username: this.username, password: this.password}) .pipe(takeUntil(this.ngUnsubscribe)) .subscribe((value) => { // 在这里处理接口返回的结果 }); } ngOnDestroy() { this.ngUnsubscribe.next(); this.ngUnsubscribe.complete(); } }
额外说明:
你的CoreService已经用@Injectable({providedIn: 'root'})装饰,这意味着它是一个单例服务,Angular会在整个应用中维护一个实例,所以你不需要在模块的providers数组中再声明它。
内容的提问来源于stack exchange,提问作者maria
相关产品推荐
相关产品推荐

