2016-02-27 70 views
7

我在下面的代碼中做了什麼錯誤?從TypeScript擴展數組

我想在我的課MyNumberList上延長Array,然後嘗試使用它。我看到的是沒有任何項目似乎被添加到列表中。當我嘗試訪問列表元素時,我得到undefined

P.S我用的打字稿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 

回答

8

數組不能在ES5進行擴展,從而使打字稿編譯器生成的代碼無法正常工作。它產生於你的構造函數的代碼是這樣的:

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 transpilers都有同樣的問題。爲了從數組中正確繼承,需要JavaScript引擎中的功能,這些功能在ES5引擎中不存在。

如果你改變你的構造函數代碼:

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

...它會正確填入您的實例。不過,我無法保證Array的其他功能的效果如何。

+0

嗯,這很有趣。你說的話是有道理的。我試圖創建一個頭等的集合,在這裏我會用一些特定於域的操作來擴充從'Array'繼承的功能。令人傷心的是,它不會使用正常的語法。 – codematix

+1

感謝您的幫助@ t-j-crowder。你調用'this.push(...數字)'的選擇似乎正在工作。然而,我可能需要更深入的修補才能找出還有什麼其他問題。 TIL,使用TypeScript時,最好查看並理解編譯後的JavaScript代碼。 – codematix

+0

偉大的研究,解決方案適合我 – BobbyTables