275 votes

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

Je suis en train de créer un jeu logique simple appelé "Three of a Crime" en TypeScript.

En essayant de pré-allouer un tableau typé en TypeScript, j'ai essayé de faire quelque chose comme ceci :

var arr = Criminal[];

w "Check format of expression term" .

J'ai également essayé de faire ceci

var arr : Criminal = [];

et ce produit "ne peut convertir aucun [] en "criminel"".

Quelle est la méthode TypeScript pour faire cela ?

357voto

Thorarin Points 21538

Les réponses existantes ayant omis une option, 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. La spécification explicite du type est la solution générale lorsque l'inférence de type échoue pour une déclaration de variable.

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

  3. L'utilisation du constructeur Array n'est utile que dans ce cas d'utilisation spécifique, mais je le trouve personnellement plus lisible. Cependant, il y a un léger impact sur les performances au moment de l'exécution*. De plus, si quelqu'un était assez fou pour redéfinir le constructeur Array, le sens peut changer .

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

* : Fait amusant : au moment de la rédaction, la différence de performance était de 60 % dans Chrome, tandis que dans Firefox, il n'y avait pas de différence de performance mesurable.

256voto

treehau5 Points 586

La question de la pré-allocation correcte d'un tableau typé en TypeScript a été quelque peu obscurcie par la syntaxe littérale des tableaux, ce qui fait que ce n'était pas aussi intuitif que je l'avais d'abord pensé.

La méthode correcte est la suivante

var arr : Criminal[] = [];

Vous obtiendrez ainsi un tableau vide correctement typé, stocké dans la variable "arr

J'espère que cela aidera d'autres personnes !

27voto

Fylax Points 630

Je sais que c'est une vieille question mais j'ai récemment été confronté à un problème similaire qui ne pouvait pas être résolu de cette manière, car je devais retourner un tableau vide d'un type spécifique.

J'avais

return [];

[] était Criminal[] type.

Ni l'un ni l'autre return: Criminal[] []; ni return []: Criminal[]; a fonctionné pour moi.

À première vue, j'ai résolu le problème en créant une variable typée (comme vous correctement signalé) juste avant de le renvoyer, mais (je ne sais pas comment fonctionnent les moteurs JavaScript) cela peut entraîner une surcharge de travail et c'est moins lisible.

Par souci d'exhaustivité, j'indiquerai également cette solution dans ma réponse :

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

Finalement, j'ai découvert le type casting de TypeScript, qui m'a permis de résoudre le problème d'une manière plus concise et plus lisible (et peut-être plus efficace) :

return <Criminal[]>[];

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

6voto

Zhihong LU Points 59

Essayez ceci, cela fonctionne pour moi.

return [] as Criminal[];

3voto

rk13 Points 29

Pour l'accès public, utilisez le modèle ci-dessous :

public arr: Criminal[] = [];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X