抽象类构造函数抛出错误

时间:2018-05-02 11:17:28

标签: angular typescript

我有一个抽象类,我提到了所有http调用,而在子服务中扩展它会在编译时抛出错误。

  

无法解析MyService的所有参数:(?)。

baseservice.ts

import { HttpClient, HttpHeaders } from '@angular/common/http';

export abstract class BaseService{

    constructor(private http: HttpClient){} //http undefined on compile time                            

    get(){
       return this.http.get()
    }    
}

myservice.ts

@Injectable()
export class MyService extends BaseService{

  getSource() {
    return this.get('api/Source')
  }
}

如果我在抽象类的构造函数中添加了其他injectTokens,则会导致not defined错误

constructor(private http: HttpClient, @Inject(APP_CONFIG) private appConfig: any | undefined) {}
  

未捕获的ReferenceError:未定义http_1

如果我尝试添加选项,它会初始化HttpClient并且所有工作正常

HttpOptions = {
   headers: new HttpHeaders({
    'Authorization': `Bearer ${this.token}`
   })

在没有任何HttpClientInjectTokens的情况下创建实例httpOtions时,这背后的原因是什么以及如何解决此问题。

2 个答案:

答案 0 :(得分:2)

你的抽象类有一个构造函数,所以......你必须在具体类中声明构造函数,然后调用super:

@Injectable()
export class MyService extends BaseService{

  constructor(private http: HttpClient){
    super(http);
  }

  getSource() {
    return this.get('api/Source')
  }
}

答案 1 :(得分:0)

putty元数据应在编译时发出,以便被识别为依赖注入。由于类型元数据的发射方式如何工作,因此应在包含元数据的类上指定装饰器。

在注入类的层次结构中,注释类具有使用TypeScript类型注释的依赖项,如http: HttpClient base 类需要http: HttpClient装饰器:

@Injectable()

如果子类有自己的构造函数,它也需要@Injectable() export abstract class BaseService{ constructor(private http: HttpClient) {} } export class MyService extends BaseService {} 装饰器:

@Injectable()

由于how @Injectable works,在使用显式@Injectable() export abstract class BaseService{ constructor(private http: HttpClient) {} } @Injectable() export class MyService extends BaseService { constructor(http: HttpClient, private foo: Foo) { super(http); } } 注释的类中没有必要。