TypeScript-generics: hva hvis Promise-avvisnings- og oppløsningstyper er forskjellige?


Enkel og vanlig Angular2+-datatjeneste som håndterer feil og bruker Promises:

// imports skipped

class DataType {}

class Error {
  constructor(error: HttpResponse) {
    this.error = error.json()
  }
}


@Injectable()
export class MyService<DataType> {
  apiUrl = 'my/url';
  constructor(protected http) {}

  get(): Promise<DataType[] | Error> {
    return this.http
    .get(this.apiUrl)
    .toPromise()
    .then(response => response.json())
    .catch(this.handleError);
  }

  protected handleError(error: HttpResponse): Promise<Error> {
    console.error('An error occurred', error);
    return Promise.reject(new Error(error));  
  }
}

I denne klassen returnerer get-metoden en Promise, som løser seg med en DataType[]-array, og avslår med Error-type.

Når jeg kompilerer denne koden, får jeg denne feilen:

Type 'Error | DataType[]' kan ikke tilordnes typen 'DataType'. Type 'Error' kan ikke tilordnes typen 'DataType'.

Jeg bruker TypeScript versjon 2.4.2. Jeg er sikker på at dette begynte å skje etter oppgraderingen av TypeScript, som gjorde typetestingene strengere.

Jeg vil vite hvordan man håndterer avslag med forskjellige typer i nyeste TypeScript. Finnes det ulike metoder for å gjøre dette?

Oppdatering: Jeg har funnet en tilsvarende feilrapport, ikke løst ennå https://github.com/Microsoft/TypeScript/issues/7588

OPPDATERING

Jeg har laget et repo som demonstrerer problemet, med to commits. Første commit bruker <TypeResolve | TypeReject>-tilnærming, andre bruker kun <TypeResolved>. Begge commits ser ut til å ikke kompilere i virkeligheten.

Svar #1

Typeparameteren for Promise er bare typen for .resolve, ikke for .reject. Typen for .reject er alltid any, fordi typen ikke kan kjennes på kompileringstidspunktet. En av grunnene til dette er at async-funksjoner, som returnerer promises, potensielt kan avvise sine promises med hvilken som helst unntak.

Du bør skrive Promise<DataType[]> i stedet, og sjekke feiltypen under kjøring der du håndterer feil.

Relaterte artikler