Letra de imprenta: no se puede escribir literales de matriz heterogéneos

votos
13

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
Publicado el 03/10/2012 a las 20:58
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
16

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 [].

Respondida el 03/10/2012 a las 21:05
fuente por usuario

votos
1

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}`); });
Respondida el 22/12/2015 a las 21:30
fuente por usuario

votos
0

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[])[][]
Respondida el 07/06/2015 a las 14:53
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more