15

これをコンパイルするには、どの型アサートが必要ですか?

class Foo {}
class Bar {}

var f =
[
    [Foo, [1, 2, 3]],
    [Bar, [7, 8, 9]],
];

エラー:

Incompatible types in array literal expression
4

3 に答える 3

16

これはうまくいきます:

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[] として推論します。

于 2012-10-03T20:05:26.580 に答える
7

現在、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}`); });
于 2015-12-23T00:30:07.567 に答える
1

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[])[][]
于 2015-06-07T14:53:46.863 に答える