2015-11-26 15 views
5

TypeScript 1.6 ve native es6 ile Vaat ediyor Promise.all([]) iki farklı dönüş türüyle her kullandığımda hata alıyorum. Örneğin:TypeScript: Type 'R' tür parametresi için argüman kullanımdan çıkar çıkarılamıyor

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

o örnekte ben typescript derleyici Promise.all hattında bir hata alıyorum 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'.

Aslında hata, ikinci ve üçüncü cümleler farklı olduğu bu başka örnek var

ama bu ilk cümle aynı. Bu yüzden temel olarak 'tip argümanlarını açıkça belirtmek' sözdiziminin ne olduğunu merak ediyorum. Bunu anlayamıyorum. Kod iyi çalışıyor, ancak bu transpiler uyarısından kurtulmak istiyorum.

cevap

1

Sadece bu geçici çözüm hakkında bilmek:

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

İşte bir çözüm var: dikey çubuk birkaç türlerinden biri olabilir bir değer belirtmek için kullanılır

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

Aslında bunu daha çok seviyorum çünkü yazımları var. Promise.all, bir Promise [] '' Promise 'içine bir dizi dönüştürdüğü için, bir T türünün, bir sendika türü kullanılarak belirtilmesi mantıklıdır. Böylece T tipi tanımlayabiliriz. T = string [] | MyObject' kodu daha temiz hale getirecek –

İlgili konular