Angular 6:为什么我不能扩展服务,而不失去儿童服务的功能?

Angular 6:为什么我不能扩展服务,而不失去儿童服务的功能?,angular,typescript,angular6,extends,Angular,Typescript,Angular6,Extends,我正在为我的前端建立一系列有角度的休息服务。在那里,我认为有一个母类BaseRestService是一个好主意,它实现了所有相同的东西,比如头和一些帮助函数 但是当我的子服务扩展BaseRestService时,当我调用一些子函数时,我会得到TypeErrors。我尝试过调试,发现子服务不是SomeExampleChildSerivce类型,而是BaseRestService类型。有人能解释一下这种行为或者告诉我我做错了什么吗 下面您可以看到my BaseRestService和一个ChildS

我正在为我的前端建立一系列有角度的休息服务。在那里,我认为有一个母类BaseRestService是一个好主意,它实现了所有相同的东西,比如头和一些帮助函数

但是当我的子服务扩展BaseRestService时,当我调用一些子函数时,我会得到TypeErrors。我尝试过调试,发现子服务不是SomeExampleChildSerivce类型,而是BaseRestService类型。有人能解释一下这种行为或者告诉我我做错了什么吗

下面您可以看到my BaseRestService和一个ChildService的代码:

@Injectable({
  providedIn: 'root'
})
export class DimensionService extends BaseRestService{
  private url: string = `${BASE_URL}/dimensions`;

  constructor(
    public httpClient: HttpClient,
    public logger: LoggingService,
    public authService: AuthenticationService,
  ){
    super(httpClient, logger, authService);
  }

  get(url: string): Observable<DimensionAttribute> {
    return this.httpClient.get<DimensionAttribute>(url, { headers: this.headers })
  }

  list(url?: string, page = 0, size = 20): Observable<Page<DimensionAttributeWrapper>> {
    if (!url) url = `${this.url}?page=${page}&size=${size}`;
    return this.httpClient.get<Page<DimensionAttributeWrapper>>(url, { headers: this.headers })
  }
}
BaseRestService:

@Injectable({
  providedIn: 'root'
})
export abstract class BaseRestService {
  headers = new HttpHeaders({
    'Content-Type': 'application/json',
    'Authorization': `JWT ${this.authService.getToken()}`
  });

  constructor(
    public httpClient: HttpClient,
    public logger: LoggingService,
    public authService: AuthenticationService,
  ) { }

  public refreshToken(): void {
    this.headers = new HttpHeaders({
      'Content-Type': 'application/json',
      'Authorization': `${this.authService.getToken()}`
    });
  }
}
儿童服务:

@Injectable({
  providedIn: 'root'
})
export class DimensionService extends BaseRestService{
  private url: string = `${BASE_URL}/dimensions`;

  constructor(
    public httpClient: HttpClient,
    public logger: LoggingService,
    public authService: AuthenticationService,
  ){
    super(httpClient, logger, authService);
  }

  get(url: string): Observable<DimensionAttribute> {
    return this.httpClient.get<DimensionAttribute>(url, { headers: this.headers })
  }

  list(url?: string, page = 0, size = 20): Observable<Page<DimensionAttributeWrapper>> {
    if (!url) url = `${this.url}?page=${page}&size=${size}`;
    return this.httpClient.get<Page<DimensionAttributeWrapper>>(url, { headers: this.headers })
  }
}

这实际上不是一个角度问题,而是一个类型脚本问题。我打赌您已经使用BaseRestService类型在消费者上定义了注入,对吗

如果您正在这样做,那么您将无法访问children方法

在这种情况下,您可能希望为子对象中的常用方法提供一个接口,然后让工厂根据某些条件为您生成子对象。还有其他注射技巧,但你明白了

或者,你可能想做一个mixin,它可以以不同的方式完成你想要的


请看

我最近又遇到了同样的问题。我在代码中看不到任何差异,所以我从版本6.1->7.0中更新了angular,解决了这个问题。

我不知道为什么,但你可以简单地将BaseRestService注入到DimensionServiceOk的构造函数中,好吧,但我想知道为什么扩展不起作用。你到底得到了什么错误?哪一行给出了这样的错误?错误发生在我使用子服务的组件中。我现在有了一个解决方法,所以无法告诉您确切的错误消息,但它是这样的类型错误:CildService不是一个函数。无论是哪个子服务,子服务器的每个函数都会出现相同的错误。我不能调用子函数,只能调用可调用的父函数。我已经像其他服务一样注入了服务,作为组件构造函数中的参数。