qué tipo asevera ¿Es necesario conseguir que esto compilar?
class Foo {}
class Bar {}
var f =
[
[Foo, [1, 2, 3]],
[Bar, [7, 8, 9]],
];
error:
Incompatible types in array literal expression
qué tipo asevera ¿Es necesario conseguir que esto compilar?
class Foo {}
class Bar {}
var f =
[
[Foo, [1, 2, 3]],
[Bar, [7, 8, 9]],
];
error:
Incompatible types in array literal expression
Esto funcionará:
class Foo {}
class Bar {}
var f: any[][] = [
[Foo, [1, 2, 3]],
[Bar, [7, 8, 9]],
];
Este dice que tiene una matriz bidimensional cuyos valores pueden ser cualquier cosa (Foo, Bar, otras matrices, etc.). También es posible usar una afirmación de tipo para sus matrices anidadas:
class Foo {}
class Bar {}
var f = [
[<any>Foo, [1, 2, 3]],
[<any>Bar, [7, 8, 9]],
];
La presencia de una sola cualquier de la matriz interior obliga al compilador para inferir su tipo como cualquier [].
Parece que mecanografiado hace tener arrays heterogéneos ahora. Por lo tanto, ya que esta pregunta surgió por primera vez cuando busqué esto, y puesto que es difícil de encontrar, de lo contrario, aquí cómo este código se puede escribir ahora:
class Foo {}
class Bar {}
var f: [Foo|Bar, number[]][] =
[[new Foo(), [1, 2, 3]],
[new Bar(), [7, 8, 9]]];
(Ahora bien, si esto va por el camino de la sintaxis tipo imitar expresiones, el tipo sería también obtener una sintaxis de [Foo|Bar, [...number]][]...)
Incluso funciona con argumentos de la función, por lo que esta bien typechecks:
function foo([obj,nums]: [Foo|Bar, number[]]) {
for (let i of nums) console.log(`i = ${i}`);
}
f.forEach(foo);
y la versión extrema:
f.forEach(([obj,nums]: [Foo|Bar, number[]]) => {
for (let i of nums) console.log(`i = ${i}`); });
A partir de imprenta 1.4 que puede hacer uniones tipo. Yo era capaz de lograr esto, así:
function zip<T, X> (array1: T[], array2: X[]): (T|X)[][] {
return array1.map(function (v: T, i: number) { return [v, array2[i]]; });
}
El tipo específico que se busca en su caso sería:
(Foo|Bar|number[])[][]
O:
(typeof Foo|typeof Bar|number[])[][]