world tutorial run hello guide cli app typescript angular4

typescript - tutorial - install angular 6



El tipo ''void'' no se puede asignar al tipo ''ObservableInput<{}>'' (3)

Este error comenzó a aparecer después de migrar a TS 2.2.2, así que asumo que ese es el problema ... El código no dejó de funcionar, pero ahora recibí ese error e intenté algunas cosas como devolver un observable vacío Al capturar la excepción re-lanzada y devolver un objeto, nada parecía funcionar. ¿Por qué sucede esto ahora? ¿No debería entender que estoy volviendo a lanzar la excepción y no espero una devolución? ¿Estoy malinterpretando el error?

Esta es la descripción completa del error:

Aquí está el código completo:

return request .map((res: Response) => res.json()) .catch((error: any) => { // todo: log? if (error.status == 500) { this.alertService.showError(error.statusText); } else if (error.status == 588) { this.alertService.showAlert(error.statusText); } Observable.throw(error.statusText); });

Intenté devolver el Observable, pero mi método de envoltura espera una devolución de tipo T , que es la devolución de mi solicitud de deserialización ( map(...) ). Si devuelvo el throw este es el error que recibo:

[ts] El tipo ''Observable'' no se puede asignar al tipo ''T''

Estoy usando:

  • Angular4
  • Mecanografía 2.2.2

A veces cuando llamas catch sin usar la función de flecha como abajo

getUserList() { return this.http.get(this.constURL + ''/loans/all'', this.headerOptions) .catch(this.handleError); } handleError(error: Response) { if (error.status == 500) { this.router.navigate([''/login'']); } else { return Observable.throw(error); } }

entonces da error de

ERROR TypeError: no se puede leer la propiedad ''navegar'' de undefined que no recibe esto

Debido a que en la función handleError, este objeto no es accesible ... si usted consola esto.ruta, entonces obtendrá indefinido ... así que este objeto no funciona y no obtiene todos los métodos disponibles del enrutador

Así que tienes que usar la función de flecha aquí como abajo

getUserList() { return this.http.get(this.constURL + ''/loans/all'', this.headerOptions) .catch(error => { return this.handleError(error); }); } handleError(error: Response) { if (error.status == 500) { this.router.navigate([''/login'']); } else { return Observable.throw(error); } }

Además, si no ha mencionado el retorno para la función handlerError, entonces volverá a aparecer el error como

El argumento de tipo ''(error: cualquiera) => void'' no se puede asignar a un parámetro de tipo

Por lo tanto, es necesario escribir return para la función handlerError.

Consulte here detalladamente. Él ha explicado el código muy bien con todos los posibles errores y la solución de eso.


Esta es una respuesta para angular 6 con RXJS 6. En su función de solicitud, se vería similar a esto. Tenga en cuenta que catch se ha reemplazado con catchError y Observable.throw ahora es throwError . También en RXJS 6 usamos pipe para unir una secuencia de funciones que deseamos realizar en lugar del encadenamiento de puntos previamente.

//In your service getData(url: string): Observable<any> { let options = this.getHTTPOptions(); return this.http.get<any>(url, options).pipe( catchError( (err: any, caught: Observable<any>) => { return throwError(this.generalErrorHandler(err, caught)) } ) ); }

Entonces puedes tener un manejador de errores. La clave es especificar el return la palabra clave en la función catchError anterior y devolver el error en el controlador. La flecha ( => ) le permite pasar el contexto de la función de llamada al controlador de errores, lo que significa que puede hacer cosas interesantes como this.router.navigate([''someroute'']); (Si tiene el enrutador importado en su servicio)

//In your service generalErrorHandler(error: any, caught: Observable<any>): Observable<any> { console.log(''error caught: '', error); if( error.error.status == "INVALID_TOKEN" || error.error.status == "MAX_TOKEN_ISSUE_REACHED"){ console.log(''token has expired''); this.logout(); return error; } return error; }

Algunas importaciones clave para que esto funcione:

//Imports for the service import { HttpClient, HttpHeaders, HttpErrorResponse } from ''@angular/common/http''; import { Http, Response } from ''@angular/http''; import { catchError, map } from ''rxjs/operators''; import { Observable, throwError, of} from ''rxjs'';

Y por último suscribirse a la solicitud para obtener sus datos:

//In your component, don''t forget to import your service let response$ = this.someService.getData(''url here''); response$.subscribe( data => { console.log(''do stuff to data here'', data); }, err => { console.log("couldn''t get data, maybe show error to user"); }, () => { console.log(''function that is called upon finish''); } );


Tienes que devolver el observable.

return request .map((res: Response) => res.json()) .catch((error: any) => { // todo: log? if (error.status == 500) { this.alertService.showError(error.statusText); } else if (error.status == 588) { this.alertService.showAlert(error.statusText); } return Observable.throw(error.statusText); });