TS 2322 в некоторых сервисах HttpClient после обновления угловой версии 5.2 до 6.0.7 - PullRequest
0 голосов
/ 29 июня 2018

Я на полпути к обновлению Angular 6 с TypeScript ~ 2.7.0. В Angular 5.2.12 я написал такие методы обслуживания:

isPartDraft = (part: number): Observable<boolean> =>
  this._http.get(`${this.rest}/isDraft/${part}`)
            .catch(MyPartService.handleError);

аннотирование определения функции типом возврата, но без указания его типа в теле функции.

Кажется, что больше невозможно в некоторых контекстах , так как tsc повышает:

TS2322:
Type 'Observable<Object>' is not assignable to type 'Observable<boolean>'.
  Type 'Object' is not assignable to type 'boolean'.

и я вынужден указать тип возвращаемого значения в теле функции, как рекомендовано в текущей документации Angular :

isPartDraft = (part: number) =>
  this._http.get<boolean>(`${this.rest}/isDraft/${part}`)
      .pipe(catchError(MyService.handleError));

Пока все хорошо (мы не меняли наши аннотации начиная с angular2-rc6, так что это могло бы скрываться какое-то время).

Но в этих случаях я не получаю ошибку TS:

getPasswordPolicy(): Observable<PasswordPolicy> {
  return this._http.get(`${this.rest}/securityPolicy/`)
    .pipe(
      map((securityPolicy: any) => securityPolicy.passwordPolicy),
      catchError(error => observableThrowError(error))
    );
}

И в другом сервисе:

getPartsAtDate = (id: number, date: string, time: string): Observable<number[]> =>
  this._http.get(`${this.rest}/partsOnDate/${id}/${date}/${time}`)
    .pipe(catchError(MyService.handleError));

getAllNewOrders = (id: number): Observable<Orders[]> =>
  this._http.get(`${this.rest}/${id}`)
    .pipe(catchError(MyService.handleError));

Так как же взаимодействуют операторы pipe(), catchError() и map(), чтобы создать эту ситуацию? Почему я не могу аннотировать определение функции в первом случае, а могу во втором?

(Конечно, я мог бы с помощью робота исправлять те места, где выдает ошибку tsc, но я бы лучше понял, что происходит, особенно если идентичные контексты, кажется, дают разные результаты.)

Как и было запрошено, вот обработчик ошибок (реализация идентична в каждой службе):

private static handleError(error: any) {
  console.log('error ' + error);
  return observableThrowError(error.status || 'Server error');
}

1 Ответ

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

Метод get перегружен, и не все версии используют Generics. Основываясь на том, как вы вызываете get в вашем первом примере, выбрана подпись, которая возвращает Observable<Object>. Если вы хотите другой вид наблюдаемого, вы должны использовать дженерики (например, get<boolean>).

Почему другие примеры работают?

map((securityPolicy: any) => securityPolicy.passwordPolicy),

Здесь вы явно меняете тип с Observable<Object> на Observable< PasswordPolicy>. Это не сработало бы, если бы у вас было map((securityPolicy: SecurityPolicy.

catchError не меняет тип наблюдаемого, как map в вашем случае. Так что все еще Observable<Object>.

...