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.

Relaterade artiklar