2016-02-27 8 views
7

何を私の下のコードで間違っていますか?TypeScriptから配列を拡張する

私のクラスMyNumberListArrayを拡張しようとしています。それを使用しようとしています。私が見ていることは、アイテムがリストに追加されていないように見えるということです。私はリスト要素にアクセスしようとするとundefinedが得られます。私は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に拡張することができないので、活字体のコンパイラが生成するコードが正しく動作しません。活字体を使用しています

P.S _superArrayある

function MyNumberList() { 
    var numbers = []; 
    for (var _i = 0; _i < arguments.length; _i++) { 
     numbers[_i - 0] = arguments[_i]; 
    } 
    _super.apply(this, numbers); 
} 

...:それはあなたのコンストラクタのために作成したコードはこれです。物事の通常の過程では、_super.apply(this, numbers)は正常に動作しますが、Array関数は、コンストラクタとして呼び出されたときとは関数として呼び出されたときとは異なる動作をします。 Babelと他のES2015(ES6)からES5の蒸散器にも同じ問題があります。配列から適切に継承するには、ESXエンジンには存在しないJavaScriptエンジン内の機能が必要です。

あなたがあなたのコンストラクタのコードを変更した場合:

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

...それは正しく、インスタンスを移入します。しかし、Arrayの他の機能がうまくいくかどうかは保証できません。

+0

本当に面白いです。あなたが言うことは理にかなっています。私はいくつかのドメイン固有の操作で 'Array'から継承した機能を拡張するファーストクラスのコレクションを作ろうとしていました。定期的な構文ではうまくいきません。 – codematix

+1

help @ t-j-crowderに感謝します。 'this.push(... numbers) 'を呼び出す代わりにあなたの代わりに働いているようです。私は、他に何が壊れているかを知るためには、より深い切れ目を必要とするかもしれません。 TILは、TypeScriptを使用しているときに、JavaScriptコードを見て理解するのに良いアイデアです。 – codematix

+0

偉大な研究、ソリューションは私のために働く – BobbyTables

関連する問題