Тип 'Наблюдаемый 'нельзя назначить типу' Observable <T>' - PullRequest
0 голосов
/ 01 апреля 2020

Проблема в строке 14

Type 'Observable<HttpEvent<T>>' is not assignable to type 'Observable<T>'.
  Type 'HttpEvent<T>' is not assignable to type 'T'.
    'HttpEvent<T>' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint '{}'.
      Type 'HttpSentEvent' is not assignable to type 'T'.
        'HttpSentEvent' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint '{}'.ts(2322)

Если я удаляю второй параметр, this.getHttpParams(obj), тогда он работает хорошо.

Но мне нужно передать параметры.

Как это решить?

import { Injectable } from '@angular/core';
import { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class DataService {
  protected url: string;

  constructor(private http: HttpClient) {}

  get<T>(endpoint: string, obj: object = null): Observable<T> {
    return this.http.get<T>(this.url + endpoint, this.getHttpParams(obj)); // Problem is here.
    // If I remove the second parameter: , this.getHttpParams(obj) - then it works good.
    // But I need to pass the parameters. How to solve this?
  }
  protected getHttpParams(obj: object) {
    const requestOptions: any = {};
    requestOptions.headers = new HttpHeaders({
      Accept: 'application/json',
      'Content-Type': 'application/json'
    });

    if (obj !== null) {
      requestOptions.params = this.objectToHttpParams(obj);
    }

    return requestOptions;
  }

  protected objectToHttpParams(obj: object): HttpParams {
    let params = new HttpParams();
    for (const key of Object.keys(obj)) {
      params = params.set(key, (obj[key] as unknown) as string);
    }

    return params;
  }
}

1 Ответ

1 голос
/ 01 апреля 2020

get имеет много перегрузок, некоторые из которых возвращают Observable<T>, а другие возвращают Observable<HttpEvent<T>>. Если возвращаемое значение из getHttpParams равно any, оно думает, что вы получите последнее.

Поэтому минимальное исправление должно быть более конкретным c о том, что может вернуть этот метод, например:

protected getHttpParams(obj: object): {headers: HttpHeaders, params?: HttpParams} { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...