2012-10-13 14 views
88

Ho una definizione di classe TypeScript che inizia così;Uso dell'array typed TypeScript

module Entities {   

    export class Person { 
     private _name: string; 
     private _possessions: Thing[]; 
     private _mostPrecious: Thing; 

     constructor (name: string) { 
      this._name = name; 
      this._possessions = new Thing[100]; 
     } 

Sembra un array di tipo Cosa non viene tradotto correttamente nel corrispondente tipo di array Javascript. Si tratta di un frammento dal JavaScript generato:

function Person(name) { 
    this._name = name; 
    this._possessions = new Entities.Thing[100](); 
} 

esecuzione di codice che contiene un oggetto Person, un'eccezione quando si tenta di inizializzare il campo _possession:

Error is "0x800a138f - Microsoft JScript runtime error: Unable to get value of the property '100': object is null or undefined".

Se cambio il tipo di _possession a any[] e inizializza _possession con l'eccezione new Array() non viene generata. Ho dimenticato qualcosa?

risposta

104

si dispone di un errore nella sintassi qui:

this._possessions = new Thing[100](); 

Questo non crea una "serie di cose". Per creare una serie di cose, si può semplicemente utilizzare la matrice espressione letterale:

this._possessions = []; 

del costruttore array se si desidera impostare la lunghezza:

this._possessions = new Array(100); 

ho creato un breve esempio di lavoro si può provare nel playground.

module Entities { 

    class Thing { 

    }   

    export class Person { 
     private _name: string; 
     private _possessions: Thing[]; 
     private _mostPrecious: Thing; 

     constructor (name: string) { 
      this._name = name; 
      this._possessions = []; 
      this._possessions.push(new Thing()) 
      this._possessions[100] = new Thing(); 
     } 
    } 
} 
+2

non aggiusta la lunghezza, ma dovrebbe preallocare l'array – Sebastian

+0

perché non puoi fare 'private _possessions: Thing []: []; 'nella definizione della classe? – SuperUberDuper

8

La traduzione è corretta, la digitazione dell'espressione non lo è. TypeScript sta digitando erroneamente l'espressione new Thing[100] come una matrice. Dovrebbe essere un errore indicizzare Thing, una funzione di costruzione, utilizzando l'operatore indice. In C# questo alloca un array di 100 elementi. In JavaScript questo chiama il valore nell'indice 100 di Thing come se fosse un costruttore. Dal momento che tali valori sono undefined solleva l'errore che hai menzionato. In JavaScript e TypeScript si desidera invece new Array(100).

Si dovrebbe segnalare questo come un bug su CodePlex.

+1

Non voglio new Array (100). Voglio un array tipizzato di Thing. Non so se questo sia un bug o solo la mia interpretazione errata delle specifiche del documento. –

44

Si potrebbe provare uno di questi. Non mi stanno dando errori.

È anche il metodo suggerito da typescript for array declaration.

Utilizzando lo Array<Thing> si sta facendo uso dei generici in dattiloscritto. È simile alla richiesta di un List<T> nel codice C#.

// Declare with default value 
private _possessions: Array<Thing> = new Array<Thing>(); 
// or 
private _possessions: Array<Thing> = []; 
// or -> prefered by ts-lint 
private _possessions: Thing[] = []; 

o

// declare 
private _possessions: Array<Thing>; 
// or -> preferd by ts-lint 
private _possessions: Thing[]; 

constructor(){ 
    //assign 
    this._possessions = new Array<Thing>(); 
    //or 
    this._possessions = []; 
} 
+2

Per preassegnare la dimensione, usare 'nuova matrice (100)'. –

+1

puoi anche usare ... [] – danday74

+0

@ danday74 - Ho aggiornato per includere il metodo, è l'impostazione predefinita quando si utilizza ts-lint consigliato/ultima configurazione. – Kieran