javascript - Utöka Array från TypeScript
Vad gör jag fel i min kod nedan?
Jag försöker utöka Array i min klass MyNumberList och sedan försöka använda den. Det jag ser är att inga objekt verkar läggas till i listan. Jag får undefined när jag försöker komma åt listelementen.
P.S Jag använder TypeScript 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
Svar #1
Arrayer kan inte utökas i ES5, så koden som TypeScript-kompilatorn producerar fungerar inte korrekt. Koden den producerar för din konstruktor är denna:
function MyNumberList() {
var numbers = [];
for (var _i = 0; _i < arguments.length; _i++) {
numbers[_i - 0] = arguments[_i];
}
_super.apply(this, numbers);
}
...där _super är Array. I normala fall skulle _super.apply(this, numbers) fungera alldeles utmärkt, men Array-funktionen beter sig annorlunda när den anropas som en funktion jämfört med när den anropas som en konstruktor. Babel och andra ES2015 (ES6) till ES5-transpilers har samma problem. För att på ett korrekt sätt ärva från en array krävs funktioner i JavaScript-motorn som helt enkelt inte finns i ES5-motorer.
Om du ändrar din konstruktörkod till:
constructor(...numbers: number[]) {
super();
this.push(...numbers);
}
...det kommer att fylla din instans korrekt. Jag kan däremot inte garantera hur väl andra funktioner i Array kommer att fungera.
