从TypeScript扩展数组

时间:2016-02-27 17:32:44

标签: javascript arrays typescript

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

我正在尝试将Array扩展到我的班级MyNumberList,然后尝试使用它。我看到的是,似乎没有任何项目被添加到列表中。当我尝试访问列表元素时,我得到undefined

P.S我正在使用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

1 个答案:

答案 0 :(得分:8)

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

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

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

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

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

...它会正确填充您的实例。但我无法保证Array的其他功能在多大程度上有效。