これをコンパイルするには、どの型アサートが必要ですか?
class Foo {}
class Bar {}
var f =
[
[Foo, [1, 2, 3]],
[Bar, [7, 8, 9]],
];
エラー:
Incompatible types in array literal expression
これをコンパイルするには、どの型アサートが必要ですか?
class Foo {}
class Bar {}
var f =
[
[Foo, [1, 2, 3]],
[Bar, [7, 8, 9]],
];
エラー:
Incompatible types in array literal expression
これはうまくいきます:
class Foo {}
class Bar {}
var f: any[][] = [
[Foo, [1, 2, 3]],
[Bar, [7, 8, 9]],
];
これは、値が何でもかまいません (Foo、Bar、その他の配列など) 2 次元配列があることを示しています。ネストされた配列に型アサーションを使用することもできます。
class Foo {}
class Bar {}
var f = [
[<any>Foo, [1, 2, 3]],
[<any>Bar, [7, 8, 9]],
];
内側の配列に単一の any が存在すると、コンパイラはその型を any[] として推論します。
現在、typescriptには異種の配列があるようです。それで、私がこれを探したときにこの質問が最初に出てきたので、そうでなければ見つけるのが難しいので、ここでこのコードをどのように書くことができるか:
class Foo {}
class Bar {}
var f: [Foo|Bar, number[]][] =
[[new Foo(), [1, 2, 3]],
[new Bar(), [7, 8, 9]]];
(これが式を模倣する型構文の道をたどると、型は...の構文も取得します[Foo|Bar, [...number]][]
)
関数の引数でも機能するため、この型チェックは問題ありません。
function foo([obj,nums]: [Foo|Bar, number[]]) {
for (let i of nums) console.log(`i = ${i}`);
}
f.forEach(foo);
極端なバージョン:
f.forEach(([obj,nums]: [Foo|Bar, number[]]) => {
for (let i of nums) console.log(`i = ${i}`); });
Typescript 1.4 の時点で、型共用体を実行できます。私はこれを次のように達成することができました:
function zip<T, X> (array1: T[], array2: X[]): (T|X)[][] {
return array1.map(function (v: T, i: number) { return [v, array2[i]]; });
}
あなたのケースで探している特定のタイプは次のとおりです。
(Foo|Bar|number[])[][]
または:
(typeof Foo|typeof Bar|number[])[][]