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

185

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

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

var arr = Criminal[];

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

a également essayé de faire cela

var arr : Criminal = [];

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

quelle est la manière «TypeScript» de faire cela?

Darethas
la source

Réponses:

169

Les réponses existantes ont manqué une option, voici donc 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 pour chaque fois que l'inférence de type échoue pour une déclaration de variable.

  2. L'avantage d'utiliser une assertion de type (parfois appelée conversion, mais ce n'est pas vraiment une conversion en TypeScript) fonctionne pour n'importe quelle expression, elle peut donc être utilisée 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. L'utilisation du 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 y a un léger impact sur les performances lors de l'exécution *. De plus, 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% dans Chrome, tandis que dans Firefox, il n'y avait pas de différence de performance mesurable.

Thorarin
la source
60% ?? : O c'est sauvage
Max Coplan
239

Le problème de la pré-allocation correcte d'un tableau typé dans TypeScript a été quelque peu obscurci en raison de la syntaxe littérale du tableau, donc ce n'était pas aussi intuitif que je le pensais au départ.

La bonne façon serait

var arr : Criminal[] = [];

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

J'espère que cela aide les autres!

Darethas
la source
20

Je sais que c'est une vieille question, mais j'ai récemment rencontré un problème similaire qui n'a pas pu être résolu de cette manière, car je devais renvoyer un tableau vide d'un type spécifique.

j'ai eu

return [];

[]était le Criminal[]type.

Ni return: Criminal[] [];ni return []: Criminal[];travaillé pour moi.

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

Par souci de rigueur, je rapporterai également cette solution dans ma réponse:

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

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

return <Criminal[]>[];

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

Fylax
la source
1

Pour une utilisation en accès public comme ci-dessous:

public arr: Criminal[] = [];
rk13
la source