【问题标题】:Extending Array in Typescript breaks constructor在 Typescript 中扩展数组会破坏构造函数
【发布时间】:2016-06-14 02:10:21
【问题描述】:

在玩打字稿时,我遇到了以下有趣的行为:

class ExtArray<U> extends Array<U> {

    constructor(...args : U[]) {
        super(...args);
    }

    public contains(element : U) : boolean {
        var i = this.indexOf(element);
        return i !== -1;
    }
}


var test : ExtArray<string> = new ExtArray("a", "b", "c");

test.push("y");

console.log(test.length); // 1

console.log(test[0]);  // y
console.log(test[1]);  // undefined
console.log("Has a: " + test.contains("a"));  // Has a: false
console.log("Has y: " + test.contains("y"));  // Has y : true

我已将 console.log 语句的输出添加为 cmets。 有关可执行示例和 javascript 代码,请参阅 this typescript playground

如您所见,传递给构造函数的元素似乎没有添加到数组中。

Whats new in Typescript 中关于 extending expression 的部分建议应该可以像 typescript 1.6 中那样扩展原生 Array 类型。 我也没有在打字稿语言参考中找到任何东西, 这解释了这种行为。

我在这里找到的关于扩展数组的大多数其他问题至少有一年的历史,并且通常谈论的是 typescript 的 1.0 之前的版本,因此建议直接设置原型链。

我真的看不出这里出了什么问题,我开始怀疑是打字稿错误。 或者至少对扩展数组有某种未记录的限制。

这里出了什么问题?

【问题讨论】:

标签: arrays constructor typescript


【解决方案1】:

如果你JSON.stringify()你的对象,会更容易理解发生了什么:

var test : ExtArray<string> = new ExtArray("a", "b", "c");
test.push("y");

// outputs {"0":"y","length":1}
document.writeln(JSON.stringify(test)); 

如果您改为新建一个原生 Array,则生成的对象会有些不同:

var test : Array<string> = new Array("a", "b", "c");
test.push("y");

// outputs ["a","b","c","y"]
document.writeln(JSON.stringify(test));

我同意你的观点,the documentation 似乎暗示子类的构造函数应该按照你期望的方式运行。更奇怪的是,在使用the methods described here 测试子类是否为Array 时,我似乎得到了不一致的结果:

test.constructor === Array // false
test instanceof Array // true
Array.isArray(test) // false

我建议在TypeScript GitHub repository 上打开一个问题。即使这是预期的行为,官方文档也具有误导性,并且应该阐明当原生对象被子类化时究竟是什么预期的。

【讨论】:

  • 感谢您的回答我已经注意到扩展数组更像是一个对象而不是数组,但我认为这并不重要(因为数组也可以被视为具有数字作为属性的对象名称)。此外,我认为 push 仍然适用于像数据结构这样的对象很奇怪。我会提交一个错误。
  • @LongHairedHacker 酷,您可以在创建问题后发布指向该问题的链接吗?我对如何解决它很感兴趣。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
  • 1970-01-01
相关资源
最近更新 更多