2016-09-08 2 views
6

Der folgende Code ist korrekt in Bezug auf den Typ, der zurückgegeben wird, da then immer das Array Versprechen zurückgeben.TypeScript-Typdefinition für provect.reject

Promise.resolve(['one', 'two']) 
.then(arr => 
{ 
    if(arr.indexOf('three') === -1) 
    return Promise.reject(new Error('Where is three?')); 

    return Promise.resolve(arr); 
}) 
.catch(err => 
{ 
    console.log(err); // Error: where is three? 
}) 

Typoskript Wurffehler:

The type argument for type parameter 'TResult' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate 'void' is not a valid type argument because it is not a supertype of candidate 'string[]'.

Aber in Wirklichkeit wird then nie void zurück.

Ich kann den Typ .then<Promise<any>> explizit angeben, aber es ist eher wie ein Workaround, nicht die richtige Lösung.

Wie schreibe ich das richtig?

Antwort

6

Sie sollten nicht Promise.resolve und Promise.rejectinnerhalb eine Versprechen-Kette zurückgeben. Die resolve sollte durch einfache Rückkehr angetrieben werden und reject sollte durch eine explizite throw new Error angetrieben werden.

Promise.resolve(['one', 'two']) 
.then(arr => 
{ 
    if(arr.indexOf('three') === -1) 
    throw new Error('Where is three?'); 

    return arr; 
}) 
.catch(err => 
{ 
    console.log(err); // Error: where is three? 
}) 

Mehr

Mehr zu versprechen https://basarat.gitbooks.io/typescript/content/docs/promise.html

+2

Als Best Practice Chaining, natürlich hast du recht, aber zur gleichen Zeit gibt es keinen Grund, warum Sie nicht 'Promise.resolve zurückkehren konnten () 'und/oder' Promise.reject() 'aus einem' then'-Handler heraus, und das OP hat eine berechtigte Frage, warum TypeScript damit unzufrieden ist. –

2

Typoskript beschwert sich über den Unterschied in den Rückgabetyp zwischen Promise.reject Rückgabewert (Promise<void>) und Ihr Promise.resolve Wert (Promise<string[]>).

Wenn Sie Ihren then Aufruf alsaufrufen, wird der Compiler vom Union-Rückgabetyp erfahren.

als @Basarat Notizen, sollten Sie nur einen Fehler statt Promise.Reject (die an was auch immer Catch-Handler übergeben wird übergeben wird) zu werfen.

Verwandte Themen