我有一个抽象类,我提到了所有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}`
})
在没有任何HttpClient
或InjectTokens
的情况下创建实例httpOtions
时,这背后的原因是什么以及如何解决此问题。
答案 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);
}
}
注释的类中没有必要。