web-dev-qa-db-fra.com

Tableau dactylographié vs any []

Dans TypeScript, quelle est la différence entre Array et any[]? Array fait-il référence à des tableaux de taille dynamique (pendant la compilation, bien sûr) et any[] Fait référence à des tableaux de taille statique passés en arguments et inférés par le compilateur? Parce qu'actuellement quand j'ai des fonctions comme:

mergeArrays(arr1 : Array, arr2 : Array);

Lorsque vous appelez cette fonction avec des données statiques, TypeScript utilise un tableau typé (type[]).

mergeArrays([true, false],  [1, 2]);
//          bool[]          number[]

Y a-t-il donc des différences au moment de la compilation entre les 2? Quand dois-je utiliser any[] Et quand dois-je utiliser Array? Parfois, définir des variables avec Array ..

var info:Array;

Les erreurs ..show comme "Impossible de convertir [] [] en tableau" lors de la configuration comme suit:

info = [[], []];
23
Robinicks

La section 3.5.4 de la spécification précise leur relation:

Un type de tableau de la forme ElementType[] est équivalent à un type d'objet avec la signature d'index [index: number]: ElementType plus un ensemble de membres équivalent au type d'interface globale Array où toutes les occurrences de la magie _element type sont remplacés par ElementType.

Impossible d'attribuer [[], []] ou [] à Array est un bogue.

Il n'y a aucune notion de tableau "de taille statique" dans TypeScript. Ils parlent tous du même tableau JavaScript sous-jacent (qui est de taille dynamique):

var x = [1, 2];
x.Push(3);
x[13] = 5;
14
Ryan Cavanaugh

La réponse précédente à cette question est obsolète depuis un certain temps maintenant.

Tout d'abord, Array nécessite un paramètre générique:

var arr: Array<any>;

Cela équivaut à:

var arr: any[];

Les types Array<any> Et any[] Sont identiques et se réfèrent tous deux à des tableaux de taille variable/dynamique.

TypeScript 3.0 a introduit les tuples, qui sont comme des tableaux de taille fixe/statique, mais pas vraiment.

Laisse-moi expliquer.

Leur syntaxe ressemble à ceci:

var arr: [any];
var arr: [any, any];
var arr: [any, any, any];
var arr: [string, number, string?, MyType];

TypeScript vous obligera à affecter un tableau de cette longueur et avec des valeurs qui ont les types correspondants.
Et lorsque vous indexez le tableau TypeScript reconnaîtra le type de variable à cet index.

Il est intéressant de noter que TypeScript ne vous empêchera pas de modifier la taille du Tuple, soit en utilisant une fonction comme .Push() ou en assignant une valeur à length. Vous devez donc vous assurer de ne pas le faire par accident.

Vous pouvez également spécifier un type "repos" pour tout élément supplémentaire:

var arr: [any, any, ...any[]];
var arr: [string, number, string?, MyType, ...YourType[]];

Dans ce cas, vous pouvez affecter plus d'éléments au tuple et la taille du tableau peut changer.

Remarque: vous ne pouvez pas affecter un tableau normal à un tuple.

Dans le cas où vous ne spécifiez qu'un type de repos, vous obtenez un ancien tableau régulier.
Les 2 expressions suivantes sont équivalentes:

var arr: [...any[]];
var arr: any[];
3
zoran404