конструктор абстрактного класса выдает ошибку - PullRequest
0 голосов
/ 02 мая 2018

У меня есть абстрактный класс, в котором я упомянул все свои 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) {}

Uncaught ReferenceError: http_1 не определен

если я пытаюсь добавить параметры, он инициализирует HttpClient и все работает нормально

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

В чем причина этого и как преодолеть эту проблему при создании экземпляра HttpClient без InjectTokens или httpOtions.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

http: HttpClient метаданные должны передаваться во время компиляции, чтобы их можно было распознать как внедрение зависимостей. Из-за того, как работает передача метаданных типа, декоратор должен быть указан в классе, который содержит метаданные.

В иерархии инъекционных классов с зависимостями, аннотированными типами TypeScript, такими как http: HttpClient, base класс нуждается @Injectable() декоратор:

@Injectable()
export abstract class BaseService{
    constructor(private http: HttpClient) {}                       
}

export class MyService extends BaseService {}

Если у дочернего класса есть собственный конструктор, ему также нужен @Injectable() декоратор:

@Injectable()
export abstract class BaseService{
    constructor(private http: HttpClient) {}                       
}

@Injectable()
export class MyService extends BaseService {
    constructor(http: HttpClient, private foo: Foo) {
        super(http);
    }                       
}

Из-за того, как работает @Injectable , в классах, где используется явная аннотация @Inject, нет необходимости.

0 голосов
/ 02 мая 2018

У вашего абстрактного класса есть конструктор, так что ... вы должны также объявить конструктор в конкретном классе и вызвать super:

@Injectable()
export class MyService extends BaseService{

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

  getSource() {
    return this.get('api/Source')
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...