我在下面的代码中做错了什么?
我正在尝试将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
答案 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);
}
...其中_super
是Array
。在正常情况下,_super.apply(this, numbers)
可以正常工作,但Array
函数在被称为函数时的行为与它被称为构造函数时的行为不同。 Babel和其他ES2015(ES6)到ES5的转发器也存在同样的问题。要从数组中正确继承,需要JavaScript引擎中的功能,这些功能在ES5引擎中不存在。
如果您将构造函数代码更改为:
constructor(...numbers: number[]) {
super();
this.push(...numbers);
}
...它会正确填充您的实例。但我无法保证Array
的其他功能在多大程度上有效。