从TypeScript扩展数组

cod*_*tix 8 javascript arrays typescript

我在下面的代码中做错了什么?

我试图扩展Array我的课程MyNumberList,然后尝试使用它.我看到的是,似乎没有任何项目被添加到列表中.undefined当我尝试访问列表元素时,我得到了一个.

PS我正在使用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
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 8

数组不能在ES5中扩展,因此TypeScript编译器生成的代码无法正常工作.它为你的构造函数生成的代码是这样的:

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

...这里_superArray.在正常的过程中,_super.apply(this, numbers)可以正常工作,但是Array当它被称为函数时,函数的行为与它被称为构造函数时的行为不同.Babel和其他ES2015(ES6)到ES5的转发器也存在同样的问题.要从数组中正确继承,需要JavaScript引擎中的功能,这些功能在ES5引擎中不存在.

如果您将构造函数代码更改为:

constructor(...numbers: number[]) {
  super();
  this.push(...numbers);
}
Run Code Online (Sandbox Code Playgroud)

...它将正确填充您的实例.但是,我无法保证其他功能的效果如何Array.