行为主体行为不正常?

时间:2019-03-09 21:12:07

标签: angular behaviorsubject

我正在尝试遵循数据表示例,但是在尝试实现数据源时遇到一个问题。最后的订阅告诉我,在我已经声明类型为any的情况下,我需要在行为主题中具有any的数据类型。

这是飞机信息服务:

import { Aircraft } from '../shared/aircraft';
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';


@Injectable({
  providedIn: 'root'
})
export class AircraftInfoService {
  aircraft: Aircraft[];
  getApi = 'https://<domainRemoved>/api/PApps_AircraftInfo?<keyRemove>';

  constructor(private httpClient: HttpClient) { 

  }

  ngOnInit() {
    console.log('aircraftInfoservice');
  }

  getAircraft() {
    return this.httpClient.get(this.getApi)
  }
}

这是数据源代码:

import { Aircraft } from '../shared/aircraft';
import { AircraftInfoService } from './aircraft-info.service';
import { BehaviorSubject } from 'rxjs';
import { CollectionViewer, DataSource } from '@angular/cdk/collections';
import { Observable } from 'rxjs';
import { of } from 'rxjs';
import { catchError, finalize } from 'rxjs/operators';

export class allAircraftInfoDataSource implements DataSource<Aircraft> {

  private aircraftDBSubject = new BehaviorSubject<any[]>([]);
  private loadingSubject = new BehaviorSubject<boolean>(false);

  public loading$ = this.loadingSubject.asObservable();

  constructor(private aircraftInfoService: AircraftInfoService) {}

  connect(collectionViewer: CollectionViewer): Observable<Aircraft[]> {
      return this.aircraftDBSubject.asObservable();
  }

  disconnect(collectionViewer: CollectionViewer): void {
      this.aircraftDBSubject.complete();
      this.loadingSubject.complete();
  }

  getAircraft() {

      this.loadingSubject.next(true);

      this.aircraftInfoService.getAircraft().pipe(
        catchError(() => of([])),
        finalize(() => this.loadingSubject.next(false))
      )
      .subscribe(data => this.aircraftDBSubject.next(data));      
  }    
}

.next(data)给我错误:

../../ src / app / services / aircraft-info-datasource.service.ts(36,56)中的错误:错误TS2345:“对象|对象”类型的参数不能将any []分配给类型为any []的参数。   “对象”类型可分配给很少的其他类型。您的意思是改用“ any”类型吗?     类型'Object'缺少类型'any []'中的以下属性:length,pop,push,concat和另外26个。

编辑问题并包括更多信息。飞行器信息服务是包含getAircraft呼叫的位置。它正在返回httpclient get,因此这就是“ any”需求类型的来源。由于这是一个http通话,因此无法键入,可以吗?如果尝试,它会给我错误。像'C'一样,是否可以在打字稿中强制转换值?

谢谢。...

2 个答案:

答案 0 :(得分:0)

如果应该输入any类型,那么实际上您可以传递任何东西。但是这里any[]是必需的。所以这是一个数组。内部的对象可以是任何对象,但是仍然要求整个对象是一个数组。由于您传递的对象可能是any[] Object类型的,因此无法保证它始终是数组。

最有可能的解决方法是使用更好的指定类型,例如Observable<Aircraft[]>,而不是Observable<any[]>

答案 1 :(得分:0)

弄清楚我需要在我的订阅调用中键入http get的返回值。现在有.subscribe((data:any [])=> this.aircraftDBSubject.next(data));一切都像魅力。哇!