2015-11-26 18 views
5

Với TypeScript 1.6 và native es6 Promises Tôi gặp lỗi mỗi khi tôi sử dụng Promise.all([]) với hai loại trả về khác nhau. Ví dụ:TypeScript: Loại đối số cho tham số kiểu 'R' không thể suy ra từ việc sử dụng

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

Trong ví dụ mà tôi nhận được một lỗi trên dòng Promise.all từ trình biên dịch nguyên cảo 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'.

Tôi thực sự có một ví dụ khác của việc này mà câu thứ hai và thứ ba của lỗi là khác nhau, nhưng câu đầu tiên là như nhau. Vì vậy, về cơ bản tôi tự hỏi cú pháp là gì cho 'xác định các đối số kiểu một cách rõ ràng'. Tôi không thể hình dung ra được. Mã chạy tốt, nhưng tôi muốn loại bỏ cảnh báo trình chuyển đổi này.

Trả lời

1

Tôi chỉ biết về việc này:

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

Dưới đây là một cách giải quyết:

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

Các thanh dọc được sử dụng để xác định một giá trị có thể là một trong nhiều loại.

+0

Tôi thực sự thích điều này tốt hơn vì nó có kiểu chữ. Vì 'Promise.all' biến một mảng' Promise [] 'thành' Promise ', nên có nghĩa là chỉ định' T' là gì, sử dụng một kiểu kết hợp. Vì vậy, chúng ta có thể định nghĩa 'type T = string [] | MyObject' để làm cho mã rõ ràng hơn –

Các vấn đề liên quan