2015-11-26 6 views
5

Mit TypeScript 1.6 und nativen es6 Promises bekomme ich einen Fehler, wenn ich Promise.all([]) mit zwei verschiedenen Rückgabetypen verwende. Zum Beispiel:TypeScript: Type Argument für den Typparameter 'R' kann nicht aus der Verwendung abgeleitet werden

let onePromise:Promise<string[]> = getOne(); 
let twoPromise:Promise<MyObject> = getTwo(); 

Promise.all([onePromise, twoPromise]) 
    .then((values:[string[], MyObject]) => { 
     let one:string[] = values[0]; 
     let two:MyObject = values[1]; 

     // do stuff 
    }); 

In diesem Beispiel bekomme ich einen Fehler auf der Promise.all Zeile aus dem Typoskript Compiler error TS2453: The type argument for type parameter 'R' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate 'string[]' is not a valid type argument because it is not a supertype of candidate 'MyObject'. Property 'length' is missing in type 'MyObject'.

Ich habe eigentlich ein anderes Beispiel dafür, wo die zweiten und dritte Sätze des Fehlers unterschiedlich sind, aber dieser erste Satz ist derselbe. Ich frage mich also, was die Syntax für das explizite Spezifizieren der Typargumente ist. Ich kann es nicht herausfinden. Der Code läuft gut, aber ich möchte diese Transpiler-Warnung loswerden.

Antwort

1

Ich weiß nur, über dieses Problem zu umgehen:

///<reference path="typings/es6-promise/es6-promise.d.ts" /> 

class MyObject {} 

let onePromise:Promise<string[]> = null; 
let twoPromise:Promise<MyObject> = null; 

Promise.all([onePromise, twoPromise]) 
    .then((data:any) => { 
     let values:[string[],MyObject] = data; 

     let one = values[0]; 
     let two = values[1]; 

     // do stuff 
    }); 
3

Hier ist eine Abhilfe:

let onePromise:Promise<string[]> = getOne(); 
let twoPromise:Promise<MyObject> = getTwo(); 

Promise.all<string[] | MyObject>([onePromise, twoPromise]) 
    .then((values:[string[], MyObject]) => { 
     let one:string[] = values[0]; 
     let two:MyObject = values[1]; 

     // do stuff 
    }); 

Der vertikale Balken verwendet wird, einen Wert angeben, die eine von mehreren Arten sein können.

+0

Ich mag das eigentlich besser, weil es typings hat. Da 'Promise.all' ein Array' Promise [] 'in ein' Promise 'transformiert, ist es sinnvoll, mit einem Union-Typ anzugeben, was' T' ist. Also könnten wir 'type T = string [] | definieren MyObject', um den Code klarer zu machen –

Verwandte Themen