2016-03-01 79 views
3

而與打字稿我遇到了那麼以下有趣的現象玩耍:在Typscript擴展陣列打破構造

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陳述意見的輸出。 有關可執行示例和javascript代碼,請參見this typescript playground

正如你所看到的,好像傳遞給構造函數的元素沒有被添加到數組中。

關於extending expression的章節Typescript中的新內容表明應該可以像打字稿1.6中那樣擴展本地數組類型。 另外,我沒有在腳本語言參考中找到任何內容, 解釋了這種行爲。

我在這裏發現的關於擴展數組的其他大多數問題都至少有一年的歷史,並且通常會討論打字前1.0版本,因此建議直接設置原型鏈。

我真的沒有看到這裏出了什麼問題,我開始懷疑打字稿錯誤。 或至少某種類型的無證延長陣列的限制。

關於這裏出了什麼問題的任何建議?

+0

有關此問題,請在https://github.com/Microsoft/TypeScript/issues/7340處打開問題。 – LongHairedHacker

+0

請參閱http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-to-subclass-an-array/ –

回答

2

這是一個比較容易理解發生了什麼事情,如果你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似乎暗示子類的構造函數應該按照你期望的方式工作。更奇怪的是,我似乎得到不一致的結果測試子類是否是一個Array使用the methods described here時:

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

我建議在開幕TypeScript GitHub repository的問題。即使這是預期的行爲,官方文檔也會產生誤導,應該澄清當本地對象被分類時究竟會發生什麼。

+0

感謝您的答案我已經注意到,擴展數組更多的是一個對象而不是數組,但我不認爲它是重要的(因爲數組也可以被看作是具有數字作爲屬性名稱的對象)。另外,我認爲推送仍然適用於像數據結構這樣的對象是很奇怪的。我會提交一個錯誤。 – LongHairedHacker

+0

@LongHairedHacker酷,你可以發佈一個問題的鏈接,一旦你創建它?我對如何解決問題感興趣。 –