2016-02-27 14 views
7

Cosa sto facendo male nel mio codice qui sotto?Estensione di Array da TypeScript

Sto provando ad estendere Array sulla mia classe MyNumberList e poi cercando di usarlo. Quello che vedo è che nessun elemento sembra essere aggiunto alla lista. Ricevo un valore undefined quando tento di accedere agli elementi dell'elenco.

P.S Sto usando dattiloscritto 1.8.2

class MyNumberList extends Array<number> { 

    constructor(...numbers: number[]) { 
    // looks like this is not working 
    super(...numbers); 
    } 
} 

let statusCodes: MyNumberList = new MyNumberList(10, 20, 30); 

console.log(statusCodes[0]);  // printing undefined 
console.log(statusCodes.length); // printing 0 

risposta

8

array non possono essere estesi in ES5, in modo che il codice che il compilatore dattiloscritto produce non funziona correttamente. Il codice che produce per il costruttore è questo:

function MyNumberList() { 
    var numbers = []; 
    for (var _i = 0; _i < arguments.length; _i++) { 
     numbers[_i - 0] = arguments[_i]; 
    } 
    _super.apply(this, numbers); 
} 

... dove _super è Array. Nel normale corso delle cose, _super.apply(this, numbers) funzionerebbe correttamente, ma la funzione Array si comporta diversamente quando viene chiamata come funzione rispetto a quando viene chiamata come costruttore. Babel e altri transporter ES2015 (ES6) a ES5 hanno lo stesso problema. Per ereditare correttamente da un array è necessario disporre di funzionalità all'interno del motore JavaScript che non sono presenti nei motori ES5.

Se si modifica il codice di costruzione per:

constructor(...numbers: number[]) { 
    super(); 
    this.push(...numbers); 
} 

... sarà popolare il caso in modo corretto. Non posso garantire quanto bene funzioneranno altre funzionalità di Array.

+0

Hmm è interessante. Quello che dici ha un senso. Stavo tentando di creare una collezione di prima classe in cui avrei aumentato la funzionalità ereditata da 'Array' con alcune operazioni specifiche del dominio. È triste che non funzionerà con la sintassi normale. – codematix

+1

Grazie per l'aiuto @ t-j-crowder. La tua alternativa alla chiamata 'this.push (... numbers)' sembra funzionare. Tuttavia, potrei aver bisogno di un armeggiare più profondo per scoprire cos'altro si rompe. TIL, quando si usa TypeScript, è una buona idea guardare e capire il codice JavaScript transpiled. – codematix

+0

ottima ricerca, la soluzione funziona per me – BobbyTables

Problemi correlati