Tapuscrit: ne peut pas écrire littéraux de tableau hétérogènes

voix
13

quel type Affirme ai-je besoin pour obtenir ce pour compiler?

class Foo {}
class Bar {}

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

Erreur:

Incompatible types in array literal expression
Créé 03/10/2012 à 20:58
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
16

Cela fonctionne:

class Foo {}
class Bar {}

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

Cela dit que vous avez un tableau à deux dimensions dont les valeurs peuvent être quelque chose (Foo, bar, d'autres tableaux, etc.). Vous pouvez également utiliser une assertion de type pour vos tableaux imbriqués:

class Foo {}
class Bar {}

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

La présence d'un seul quelconque dans le réseau interne force le compilateur de déduire son type que tout [].

Créé 03/10/2012 à 21:05
source utilisateur

voix
1

Il ressemble à tapuscrit n'ont des réseaux hétérogènes maintenant. Donc, étant donné que cette question a été soulevée d' abord quand j'ai regardé pour cela, et comme il est difficile de trouver autrement, voici comment ce code peut être écrit maintenant:

class Foo {}
class Bar {}

var f: [Foo|Bar, number[]][] =
    [[new Foo(), [1, 2, 3]],
     [new Bar(), [7, 8, 9]]];

(Maintenant , si cela descend la route de la syntaxe de type mimer les expressions, le type serait également obtenir une syntaxe [Foo|Bar, [...number]][]...)

Il fonctionne même avec des arguments de fonction, donc ce typable bien:

function foo([obj,nums]: [Foo|Bar, number[]]) {
  for (let i of nums) console.log(`i = ${i}`);
}

f.forEach(foo);

et la version extrême:

f.forEach(([obj,nums]: [Foo|Bar, number[]]) => {
  for (let i of nums) console.log(`i = ${i}`); });
Créé 23/12/2015 à 00:30
source utilisateur

voix
0

Comme dactylographiées 1.4 vous pouvez faire les syndicats de type. J'ai pu accomplir cela comme ceci:

function zip<T, X> (array1: T[], array2: X[]): (T|X)[][] {
    return array1.map(function (v: T, i: number) { return [v, array2[i]]; });
}

Le type spécifique que vous rechercher dans votre cas serait la suivante:

(Foo|Bar|number[])[][]

Ou:

(typeof Foo|typeof Bar|number[])[][]
Créé 07/06/2015 à 14:53
source utilisateur

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