2013-04-05 22 views
63

Sto creando un semplice gioco di logica chiamato "Three of a Crime" in TypeScript.TypeScript: creazione di un array di contenitori digitato vuoto

Quando si cerca di pre-assegnati serie digitato a macchina, ho cercato di fare qualcosa di simile:

var arr = Criminal[]; 

che ha dato l'errore "Controllare formato del termine espressione".

provato anche a fare questo

var arr : Criminal = []; 

e questo ha prodotto "non può convertire qualsiasi [] per 'Criminal'

ciò che è modo in cui il 'dattiloscritto' per fare questo?

risposta

111

La questione della la pre-allocazione corretta di un array tipizzato in TypeScript era alquanto oscurata a causa della sintassi letterale dell'array, quindi non era così intuitiva come pensavo prima.

Il modo corretto sarebbe

var arr : Criminal[] = []; 

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

Spero che questo aiuta gli altri!

12

So che questa è una vecchia domanda ma di recente ho affrontato un problema simile che non è stato possibile risolvere in questo modo, poiché ho dovuto restituire un array vuoto di un tipo specifico.

ho avuto

return []; 

dove [] era Criminal[] tipo.

return: Criminal[] [];return []: Criminal[]; hanno funzionato per me.

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

Per completezza ti segnalo questa soluzione nella mia risposta troppo:

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

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

return <Criminal[]>[]; 

Spero che questo aiuti i futuri lettori!

+5

'Anche [] come Criminale funziona. –

30

Le risposte esistenti 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. specificando esplicitamente il tipo è la soluzione generale per ogni volta inferenza di tipo non riesce per una dichiarazione di variabile.

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

  3. L'utilizzo del costruttore Array è qualcosa che ti aiuterà solo in questo specifico caso d'uso, ma che personalmente trovo più leggibile. Tuttavia, c'è un leggero performance impact in fase di esecuzione *. Inoltre, se qualcuno fosse abbastanza pazzo da ridefinire il costruttore Array, the meaning could change.

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

*: fatto divertente; al momento della stesura di questo articolo, la differenza di prestazioni era del 60% in Chrome, mentre in Firefox non c'erano differenze di prestazioni misurabili.