TypeScript: creazione di un array contenitore tipizzato vuoto


184

Sto creando un semplice gioco di logica chiamato "Three of a Crime" in TypeScript.

Quando ho provato a pre-allocato l'array tipizzato in TypeScript, ho provato a fare qualcosa del genere:

var arr = Criminal[];

che ha dato l'errore "Controlla il formato del termine di espressione".

anche provato a farlo

var arr : Criminal = [];

e questo prodotto "non può convertire alcun [] in" Criminale "

qual è il modo 'TypeScript' per farlo?

Risposte:


168

Le risposte esistenti hanno perso un'opzione, quindi ecco un elenco completo:

// 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. Specificare esplicitamente il tipo è la soluzione generale per ogni volta che l'inferenza del tipo non riesce per una dichiarazione variabile.

  2. Il vantaggio di usare un'asserzione di tipo (a volte chiamata cast, ma in realtà non è un cast in TypeScript) funziona per qualsiasi espressione, quindi può essere utilizzato anche quando non viene dichiarata alcuna variabile. Esistono due sintassi per le asserzioni di tipo, ma solo quest'ultima funzionerà in combinazione con JSX se ti interessa.

  3. L'uso del costruttore di array è qualcosa che ti aiuterà solo in questo caso d'uso specifico, ma che trovo personalmente il più leggibile. Tuttavia, si verifica un leggero impatto sulle prestazioni in fase di esecuzione *. Inoltre, se qualcuno fosse abbastanza pazzo da ridefinire il costruttore di array, il significato potrebbe cambiare .

È una questione di preferenze personali, ma trovo la terza opzione la più leggibile. Nella stragrande maggioranza dei casi i lati negativi citati sarebbero trascurabili e la leggibilità è il fattore più importante.

*: Fatto divertente; al momento in cui scrivevo la differenza di prestazioni era del 60% in Chrome, mentre in Firefox non c'erano differenze di prestazioni misurabili.


60% ?? : O È selvaggio
Max Coplan

239

Il problema della pre-allocazione corretta di un array tipizzato in TypeScript è stato in qualche modo oscurato a causa della sintassi letterale dell'array, quindi non era intuitivo come pensavo inizialmente.

Il modo corretto sarebbe

var arr : Criminal[] = [];

Questo ti darà un array vuoto, correttamente digitato e memorizzato nella variabile 'arr'

Spero che questo aiuti gli altri!


20

So che questa è una vecchia domanda, ma di recente ho affrontato un problema simile che non poteva essere risolto in questo modo, poiché dovevo restituire un array vuoto di un tipo specifico.

avevo

return [];

dove []eraCriminal[] il tipo.

return: Criminal[] [];return []: Criminal[]; lavorato per me.

A prima vista l'ho risolto creando una variabile tipizzata (come hai riportato correttamente) poco prima di restituirla, ma (non so come funzionano i motori JavaScript) potrebbe creare sovraccarico ed è meno leggibile.

Per completezza segnalerò anche questa soluzione nella mia risposta:

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

Alla fine ho trovato il cast di tipo TypeScript, che mi ha permesso di risolvere il problema in un modo più conciso e leggibile (e forse efficiente):

return <Criminal[]>[];

Spero che questo possa aiutare i futuri lettori!


1

Per l'accesso pubblico utilizzare come di seguito:

public arr: Criminal[] = [];
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.