2016-02-27 15 views
7

Was mache ich falsch in meinem unteren Code?Erweitern Array von TypeScript

Ich versuche, Array auf meine Klasse MyNumberList zu erweitern und dann zu versuchen, es zu verwenden. Was ich sehe, ist, dass anscheinend keine Gegenstände zur Liste hinzugefügt werden. Ich bekomme eine undefined, wenn ich versuche, auf die Listenelemente zuzugreifen.

P. S Ich bin mit Typoskript 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 

Antwort

8

Arrays können nicht in ES5 erweitert werden, so dass der Code, der Typoskript Compiler korrekt funktioniert nicht produziert. Der Code für Ihren Konstruktor erzeugt, ist dies:

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

... wo _super ist Array. Im normalen Verlauf der Dinge würde _super.apply(this, numbers) gut funktionieren, aber die Array-Funktion verhält sich anders, wenn es als eine Funktion aufgerufen wird, als wenn es als Konstruktor aufgerufen wird. Babel und andere ES2015 (ES6) bis ES5-Transpiler haben das gleiche Problem. Um von einem Array ordnungsgemäß zu erben, sind Funktionen innerhalb der JavaScript-Engine erforderlich, die in ES5-Engines nicht vorhanden sind.

Wenn Sie Ihren Konstruktorcode ändern:

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

... es wird die Instanz korrekt füllen. Ich kann nicht garantieren, wie gut andere Funktionen von Array funktionieren.

+0

Hmm das ist interessant. Was Sie sagen, macht Sinn. Ich habe versucht, eine erstklassige Sammlung zu erstellen, in der ich die Funktionalität, die von 'Array' geerbt wurde, mit einigen domänenspezifischen Operationen erweitern würde. Es ist traurig, dass es nicht mit regulärer Syntax funktioniert. – codematix

+1

Danke für Ihre Hilfe @ t-j-Crowder. Ihre Alternative zum Aufruf von 'this.push (... numbers)' scheint zu funktionieren. Ich muss jedoch tiefer basteln, um herauszufinden, was sonst noch passiert. TIL, wenn Sie TypeScript verwenden, ist es eine gute Idee, den transpilierten JavaScript-Code zu betrachten und zu verstehen. – codematix

+0

großartige Forschung, Lösung funktioniert für mich – BobbyTables

Verwandte Themen