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




matrice javascript (3)

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

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!

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

Lorsque j'essayais de pré-allouer un tableau typé en 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 le faire

var arr : Criminal = [];

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

Quelle est la façon de faire 'TypeScript'?


Answer #1

Je sais que c'est une vieille question mais j'ai récemment fait face à un problème similaire qui n'a pas pu être résolu de cette façon, car j'ai dû retourner un tableau vide d'un type spécifique.

j'avais

return [];

[] était de type Criminal[] .

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 you correctement signalé) juste avant de le renvoyer, mais (je ne sais pas comment fonctionnent les moteurs JavaScript) cela peut créer des surcharges et c'est moins lisible.

Pour la rigueur, je rapporterai cette solution dans ma réponse aussi:

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

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

return <Criminal[]>[];

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


Answer #2

Les réponses existantes ont raté 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 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 cast, mais ce n'est pas vraiment un cast en TypeScript) fonctionne pour n'importe quelle expression, donc elle peut ê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 vous vous en souciez.

  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 *. En outre, si quelqu'un était assez fou pour redéfinir le constructeur Array, la signification 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, 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.





typescript