Utilizzo dell'array tipizzato TypeScript


96

Ho una definizione di classe TypeScript che inizia in questo modo;

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 che un array di tipo Thing non venga tradotto correttamente nel tipo di array Javascript corrispondente. Questo è uno snippet del JavaScript generato:

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

L'esecuzione del codice contenente un oggetto Person, genera un'eccezione quando si tenta di inizializzare il campo _possession:

L'errore è "0x800a138f - Errore di runtime Microsoft JScript: impossibile ottenere il valore della proprietà" 100 ": l'oggetto è nullo o non definito".

Se cambio il tipo di _possession in any[] e inizializzo _possession con new Array()eccezione, non viene lanciato. Ho dimenticato qualcosa?

Risposte:


120

Hai un errore nella sintassi qui:

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

Questo non crea un "array di cose". Per creare un array di cose, puoi semplicemente usare l'espressione letterale array:

this._possessions = [];

Del costruttore dell'array se vuoi impostare la lunghezza:

this._possessions = new Array(100);

Ho creato un breve esempio di lavoro che puoi provare nel parco giochi .

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 fissa la lunghezza, ma piuttosto dovrebbe preallocare l'array
Sebastian

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

54

Potresti provare uno di questi. Non mi danno errori.

È anche il metodo suggerito dal dattiloscritto per la dichiarazione dell'array .

Usando il Array<Thing>si sta facendo uso dei generici in dattiloscritto. È simile alla richiesta di un List<T>codice in 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 = [];
}

3
Per preallocare la dimensione, utilizzare new Array<Thing>(100).
Doug Domeny

1
puoi anche usare ... <Thing> []
danday74

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

9

La traduzione è corretta, la digitazione dell'espressione no. TypeScript sta digitando in modo errato l'espressione new Thing[100]come un array. Dovrebbe essere un errore indicizzare Thing, una funzione di costruzione, usando l'operatore di indice. In C # questo allocherebbe una matrice di 100 elementi. In JavaScript questo chiama il valore all'indice 100 di Thingcome se fosse un costruttore. Poiché quel valore è undefinedsolleva l'errore che hai menzionato. In JavaScript e TypeScript vuoi new Array(100)invece.

Dovresti segnalarlo come un bug su CodePlex.


1
Non voglio il nuovo Array (100). Voglio un array digitato di Thing. Non so se si tratta di un bug o solo di una mia interpretazione errata delle specifiche del documento.
Klaus Nji
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.