2015-11-26 32 views
5

Con TypeScript 1.6 e nativo es6 Promises Ricevo un errore ogni volta che utilizzo Promise.all([]) con due tipi di restituzione diversi. Ad esempio:TypeScript: L'argomento del tipo per il parametro di tipo 'R' non può essere dedotto dall'uso

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 questo esempio si ottiene un errore sulla linea Promise.all dal compilatore tipografico 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'.

realtà ho un altro esempio di questo, dove la seconda e la terza frase dell'errore sono differenti, ma quella prima frase è la stessa. Quindi, in sostanza, mi chiedo quale sia la sintassi per "specificare esplicitamente gli argomenti del tipo". Non riesco a capirlo. Il codice funziona bene, ma mi piacerebbe sbarazzarmi di questo avvertimento del traspolatore.

risposta

1

so solo su questa soluzione:

///<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

Ecco una soluzione:

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 
    }); 

La barra verticale viene utilizzato per specificare un valore che può essere uno dei diversi tipi.

+0

In realtà mi piace molto perché ha digitato. Poiché 'Promise.all' trasforma un array' Promessa [] 'in una' Promessa ', ha senso specificare quale' T' è, usando un tipo di unione. Quindi potremmo definire 'type T = string [] | MyObject' per rendere il codice più chiaro –

Problemi correlati