angular - Hur kan ett fel av typen any ändras till ett fel av typen Error?


import {NgModule, ErrorHandler} from '@angular/core';

class MyErrorHandler implements ErrorHandler {
  handleError(error:any) {  
    // do something with the exception
     console.log('Error',error);
  }
}

Jag använder ErrorHandler för att fånga de undantag som genereras. Felet som fångas är av typen ERROR men här i klassen är felet av typen error:any, vilket gör att console.log('Error', error); skriver ut Error Uncaught (in promise): [object Object] eftersom typen av felobjekt är any.

Hur kan jag ändra error-objektet till ERROR i handleError(error:any)?

Svar #1

Typescript gör ingen typkontroll vid körning. Och eftersom ett Error ÄR any (any betyder bara 'vilket objekt som helst'), är det helt giltigt att anropa handleError(error: any) med ett Error-objekt.

Det är lite som att "avstå" från typprovning under transpilering till JavaScript.

Så när du säger: "prints Error Uncaught (in promise): [object Object] eftersom typen av felobjekt är any.", är chansen stor att typen "any" faktiskt ÄR ett Error. När du skriver ut ett objekt till konsolen ser det alltid ut som [object Object] (om inte din konsol har någon fin parsering som Chrome-konsolen, där den visar ett interaktivt objekt). Om du vill ha json: gör error.toJSON() så kommer du att se alla fält i felobjektet och kunna avgöra om det faktiskt är ett Error.

Jag misstänker att du vill göra något i stil med:

console.log('Error', error.message);

Jag vet inte vilka fält Error har utantill. Om du inte heller vet det kan du använda as-kommandot för att göra saker enkelt när du skriver kod:

handleError(e: any) {  
  // do something with the exception
  const error as Error;
  console.log('Error', error.message);
}

Självklart, det skulle gå sönder om någon använder det på ett objekt som inte är ett Error-objekt (eller ett objekt som inte har ett message så det är förmodligen bäst att göra en kontroll:

handleError(e: any) {  
  // do something with the exception
  const error as Error;
  if (error.message) {
      console.log('Error', error.message);
  } else {
     console.log('Unspecified error!');
  }
}