Я на полпути к обновлению 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');
}