2015-11-26 4 views
5

TypeScript 1.6とネイティブes6との約束Promise.all([])を2つの異なる戻り値の型で使用するとエラーが発生します。その例ではTypeScript:タイプパラメータ 'R'のタイプ引数は用途から推測できません

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

私は、エラーの2番目と3番目の文が異なる場合、私は実際にこのの他の例を持って活字体コンパイラ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'.

からPromise.allライン上のエラーを取得しますが、例えば:その最初の文は同じです。ですから、基本的には、構文が '型引数を明示的に指定する'ことを考えています。私はそれを把握していないようだ。コードはうまく動作しますが、私はこの蒸散器の警告を取り除きたいと思います。

答えて

1

私はこの回避策を知っている:

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

は、ここでの回避策です:

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

垂直バーはいくつかの種類のいずれかの値を指定するために使用されます。

+0

タイピングがあるので、実際はこの方が好きです。 'Promise.all'は配列' Promise [] 'を' Promise 'に変換するので、' T 'が何であるかを指定するのは合併型を使うのが理にかなっています。だから、 'type T = string [] |コードを明確にするMyObject –

関連する問題