Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

323
Vistas
El tipo 'vacío' no se puede asignar al tipo 'ObservableInput<{}>'

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 recibo ese error e intenté algunas cosas como devolver un observable vacío , capturando la excepción lanzada de nuevo y devolviendo 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 esperar un retorno? ¿Estoy leyendo mal el error?

Esta es la descripción completa del error:

ingrese la descripción de la imagen aquí

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 contenedor espera un retorno de tipo T , que es el retorno de mi solicitud deserializado ( map(...) ). Si devuelvo el throw , este es el error que obtengo:

[ts] El tipo 'Observable' no es asignable al tipo 'T'

Estoy usando:

  • Angular4
  • Texto mecanografiado 2.2.2
over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

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); });
over 4 years ago · Santiago Trujillo Denunciar

0

A veces, cuando llamas a catch sin usar la función de flecha como se muestra a continuación

 getUserList() { return this.http.get(this.constURL + '/api/url/here', 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 indefinido sin obtener esto

Debido a que en la función handleError, este objeto no es accesible ... si consola este enrutador, obtendrá indefinido ... por lo que este objeto no funciona y no obtiene enrutador todos los métodos disponibles

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

 getUserList() { return this.http.get(this.constURL + '/api/url/here', 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 de la función handlerError, volverá a generar un error como

El argumento de tipo '(error: any) => void' no se puede asignar al parámetro de tipo

Entonces es necesario escribir return para la función handlerError.

Verifique aquí en detalle. Ha explicado muy bien el código con todos los errores posibles y la solución de eso ... funcionó para mí

over 4 years ago · Santiago Trujillo Denunciar

0

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 reemplazó con catchError y Observable.throw ahora es throwError . También en RXJS 6 usamos tubería para unir una secuencia de función que deseamos realizar en lugar del encadenamiento de puntos anterior.

 //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 controlador de errores. La clave es especificar la palabra clave return 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 geniales 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 para suscribirte a la solicitud de obtener tus 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'); } );
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda