【问题标题】:Extending Array from TypeScript从 TypeScript 扩展数组
【发布时间】:2016-06-10 22:15:27
【问题描述】:

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

我正在尝试在我的班级 MyNumberList 上扩展 Array,然后尝试使用它。我看到的是似乎没有项目被添加到列表中。当我尝试访问列表元素时,我得到一个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

【问题讨论】:

    标签: javascript arrays typescript


    【解决方案1】:

    数组无法在 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 的其他功能的效果如何。

    【讨论】:

    • 嗯,这很有趣。你说的很有道理。我试图创建一个一流的集合,我将通过一些特定于域的操作来增强从Array 继承的功能。遗憾的是它不适用于常规语法。
    • 感谢您的帮助@t-j-crowder。您拨打this.push(...numbers) 的替代方法似乎有效。然而,我可能需要更深入的修补来找出还有什么问题。 TIL,在使用 TypeScript 时,查看和理解转译的 JavaScript 代码是个好主意。
    猜你喜欢
    • 2012-09-29
    • 2017-01-21
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 2020-01-09
    • 2020-08-12
    • 2022-10-07
    • 2022-07-12
    相关资源
    最近更新 更多