web-dev-qa-db-fra.com

TypeScript: Création d'un tableau de conteneur typé vide

Je crée un jeu de logique simple appelé "Three of a Crime" dans TypeScript.

Lors de la tentative de pré-alloué tableau typé dans TypeScript, j'ai essayé de faire quelque chose comme:

var arr = Criminal[];

qui a donné l'erreur "Vérifier le format du terme d'expression".

aussi essayé de le faire

var arr : Criminal = [];

et cela produit "ne peut convertir aucun [] en" criminel "

quelle est la méthode 'TypeScript' pour faire cela?

143
darethas

La question de pré-allouer correctement un tableau typé dans TypeScript était quelque peu obscurcie en raison de la syntaxe littérale de tableau. Elle n’était donc pas aussi intuitive que je le pensais au départ.

La bonne façon serait

var arr : Criminal[] = [];

Cela vous donnera un tableau vide correctement typé et stocké dans la variable 'arr'

J'espère que cela aide les autres!

217
darethas

Les réponses existantes manquaient une option, alors voici une liste complète:

// 1. Explicitly declare the type
var arr: Criminal[] = [];

// 2. Via type assertion
var arr = <Criminal[]>[];
var arr = [] as Criminal[];

// 3. Using the Array constructor
var arr = new Array<Criminal>();
  1. Spécifier explicitement le type est la solution générale à chaque fois que l'inférence de type échoue pour une déclaration de variable.

  2. L'avantage d'utiliser assertion de type (parfois appelé un transtypage, mais ce n'est pas vraiment un transtypage en TypeScript) fonctionne pour toutes les expressions, de sorte qu'il peut être utilisé même lorsqu'aucune variable n'est déclarée. Il existe deux syntaxes pour les assertions de type, mais seule cette dernière fonctionnera en combinaison avec JSX si cela vous intéresse.

  3. Utiliser le constructeur Array est quelque chose qui ne vous aidera que dans ce cas d'utilisation spécifique, mais que je trouve personnellement le plus lisible. Cependant, il existe un léger impact sur les performances au moment de l'exécution *. En outre, si quelqu'un était assez fou pour redéfinir le constructeur Array, le sens pourrait changer .

C'est une question de préférence personnelle, mais je trouve la troisième option la plus lisible. Dans la grande majorité des cas, les inconvénients mentionnés seraient négligeables et la lisibilité est le facteur le plus important.

*: Fait amusant; Au moment de la rédaction de cet article, la différence de performance était de 60% sous Chrome, alors qu’aucune différence de performance n’était visible dans Firefox.

97
Thorarin

Je sais que c’est une vieille question, mais j’ai récemment fait face à un problème similaire, qui ne pourrait pas être résolu de cette façon, car je devais renvoyer un tableau vide d’un type spécifique.

J'avais

return [];

[] était Criminal[] type.

Ni return: Criminal[] []; ni return []: Criminal[]; ne fonctionnaient pour moi.

À première vue, je l'ai résolu en créant une variable typée (comme vous correctement signalé) juste avant de la renvoyer, mais (je ne sais pas comment les moteurs JavaScript fonctionnent), cela risque de créer une surcharge et d'être moins lisible.

Par souci de minutie, je vais également signaler cette solution dans ma réponse:

let temp: Criminal[] = [];
return temp;

Finalement, j'ai trouvé le transtypage de caractères TypeScript, ce qui m'a permis de résoudre le problème de manière plus concise et lisible (et peut-être plus efficace):

return <Criminal[]>[];

J'espère que cela aidera les futurs lecteurs!

18
Fylax

Pour un accès public, utilisez comme ci-dessous:

public arr: Criminal[] = [];
0
rk13