Угловой 6 - catchError с подтипом - PullRequest
0 голосов
/ 07 июня 2018

Я разрабатываю угловое 6 приложение, которое взаимодействует с некоторыми службами REST.Все ответы служб REST заключены в объект, подобный следующему:

{
   error: false,
   message: '',
   status: 200,
   value: {}
}

Свойство Value содержит извлеченные данные и может быть любым.

Я повторил эту структуру в машинописный текст с этим классом

export class BaseRestResponse<T> {

  private _error: number;
  private _message: string;
  private _status: number;
  private _value: T;

  constructor();
  constructor(error: number, message: string, status: number, value: T);
  constructor(error?: number, message?: string, status?: number, value?: T) {
    this._error = error;
    this._message = message;
    this._status = status;
    this._value = value;
  }

  get error(): number {
    return this._error;
  }

  get message(): string {
    return this._message;
  }

  get status(): number {
    return this._status;
  }

  get value(): T {
    return this._value;
  }
}

У меня есть базовая служба, содержащая некоторые общие данные и функцию для обработки ошибок http, функцию для передачи в rxjs catchError

import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Observable, of } from 'rxjs';
import { BaseRestResponse } from './base.rest.response';

const httpOptions = {
  headers: new HttpHeaders({'Content-Type': 'application/json'})
};

export abstract class BaseService {

  baseUrl = 'http://localhost:8080/xxx';

  constructor(protected http: HttpClient) {
    this.http = http;
  }

  /**
   * @param operation 
   * @param result 
   * @returns {(error:any)=>Observable<T>}
   */
  public handleHttpError<T>(operation = 'operation', result?: T) {
    return (error: any): Observable<T> => {

        return of(result as T);
    };
  }
}

Затем у меня есть служба продукта, расширяющая мойбазовый сервис, подобный этому:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, of } from 'rxjs';
import { catchError, tap } from 'rxjs/operators';
import { BaseService } from './base.service';
import { Product } from './product/product';
import { BaseRestResponse } from './base.rest.response'

const LOCAL_URL = '/product/find';

@Injectable({
  providedIn: 'root'
})
export class ProductService extends BaseService {

  private url: string;

  constructor(http: HttpClient) {
    super(http);
    this.url = this.baseUrl + LOCAL_URL;
  }

  getAll(): Observable<Product[]> {
    let resp = new BaseRestResponse<Product[]>(this.http.get<Product[]>(this.url).pipe(
      catchError(this.handleHttpError('getAll', BaseRestResponse<Product[]>)) // this line fails to compile
    ));
    return resp;
  }

}

Но я получаю эту ошибку:

ОШИБКА в src / app / product.service.ts (25,76): ошибка TS1005: '('ожидается. src / app / product.service.ts (26,7): ошибка TS1005:') 'ожидается.

Я пытаюсь создать обобщенную функцию handleHttpError, котораяможет вернуть BaseRestResponse в соответствии с тем, что необходимо, но я не могу понять, как решить эту проблему

1 Ответ

0 голосов
/ 07 июня 2018

Вы ошибаетесь со вторым аргументом BaseRestResponse<Product[]>.Это должно быть значение, а не тип объекта

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...