какой тип утверждает, мне нужно, чтобы получить это составить?
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, другие массивами, и т.д.). Вы можете также использовать утверждение типа для вложенных массивов:
class Foo {}
class Bar {}
var f = [
[<any>Foo, [1, 2, 3]],
[<any>Bar, [7, 8, 9]],
];
Наличие одной какой-либо во внутреннем массиве заставляет компилятор, чтобы вывести его тип, как и любой [].
Похоже , что машинопись делает имеют разнородные массивы в настоящее время. Так, так как этот вопрос пришел первый , когда я смотрел на это, и так как трудно найти иначе, вот как этот код может быть записан в настоящее время:
class Foo {}
class Bar {}
var f: [Foo|Bar, number[]][] =
[[new Foo(), [1, 2, 3]],
[new Bar(), [7, 8, 9]]];
(Теперь , если это идет вниз по дороге синтаксиса типа имитирующего выражения, тип будет также получить синтаксис [Foo|Bar, [...number]][]...)
Он даже работает с аргументами функции, так что typechecks отлично:
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}`); });
По состоянию на машинопись 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[])[][]