2016-06-16 7 views
0

に(AngularJS IQServiceから簡略化)として宣言されている方法を検討:

all<T1, T2>(values: [IPromise<T1>, IPromise<T2>]): IPromise<[T1, T2]>; 

をそれは最初の項目はIPromise<T1>と2番目の項目IPromise<T2>ある配列をとります。この宣言を使用する場合、私は何とか私はこのように、このメソッドを使用することができないこと、驚いた:

var promises = [a(), b()]; 
$q.all(promises).then(/*...*/); 

> TS2329 Index signature is missing in type '(IPromise<A> | IPromise<B>)[]' 

これが正常に動作している間:

$q.all([a(), b()]).then(/*...*/); 

私は​​が(A|B)[]としてのpを作成することを、理解しています。私の質問は、そのような場合[A, B](A|B)[]を適合させる最良の方法は何ですか。だから、どのように私は明示的にa()b()の種類を参照することなく、これを修正することができますが、$q.all

var promises: [???] = [a(), b()]; 
$q.all(promises).then(/*...*/); 

答えて

1

の戻り値にlossing型情報なしには、明示的にこの構文を使用して「デフォルト」タイプの推論をオーバーライドコンパイラに伝えることができます:

let promises = [a(), b()] as [IPromise<number>, IPromise<boolean>]; 

またはあなたが明示的に型を定​​義する必要がないようにあなたのためにそれを「ラップ」でしょうヘルパー関数を、作成することができます。

function toArray<T1, T2>(a: T1, b: T2) { 
    return [a, b] as [T1, T2]; 
} 
+0

もちろん、それは私が「a()とb()の型を明示的に参照せずに」と言ったときに意味するものです – hansmaad

+0

ああ、私は見て、申し訳ありません。その場合は、簡単なヘルパー関数を作成することをお勧めします。私は他の方法を見ることはできません。その答えを更新しました。 –

+0

問題はありません)私は[ここ](https://github.com/Microsoft/TypeScript/issues/9216)の問題を提出し、まったく同じ回避策を得ました:)タプルリテラル[ここ](https ://github.com/Microsoft/TypeScript/issues/9217) – hansmaad

関連する問題