2016-10-28 7 views
1

私はtypescriptですでこれを書いて:、それが生成活字体は、 - > ES5問題

> [...Array(10)].map((item) => 0); 
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] 

一旦JavaScriptでtranspilied:

ノードコンソールで
const mask = [...Array(10)].map((item) => 0); 

は、それが10ゼロの配列を生成

var mask = Array(10).slice().map(function (item) { return 0; }); 

これは同等ではありません。

> Array(10).slice().map(function (item) { return 0; }) 
[ , , , , , , , , , ] 

私は、タイスクリプトがiso-functionalコードを生成すると思われていました。私は間違っていた?私はTSが作り出しているすべてに注意を払うべきですか?

私はこの設定で1.20150623.0 TSC、ノードV7を使用しています:

{ 
    "compilerOptions": { 
    "emitDecoratorMetadata": true, 
    "module": "commonjs", 
    "target": "ES5", 
    "outDir": ".tmp/js", 
    "rootDir": "js" 
    } 
} 
+1

私は、これを再現**しかし**できます:あなたのTS、コピーして貼り付け、正常に動作します。 JSフォームの 'map'は失敗していますが、そうではありません。面白い何かが起こっている。 – ssube

+1

@ssube:JSは期待どおりに動作しています。 '.slice()'メソッドは配列の穴を無視するので、元のものを正確に表します。 [22.1.3.22 Array.prototype.slice(start、end)](http://www.ecma-international.org/ecma-262/6.0/#sec-array.prototype.slice)、特にポイント15(d )、* kPresent *は現在のインデックスの* HasProperty *の結果です。 –

+0

@squint正確には 'slice' _does_はあなたに10個の空白文字を持つ同じ配列を与えます。しかし、 '.map'はそれらをメソッドの"機能的な "ファミリとして無視します。 - forEach'、' map'、 'reduce'、' some'などは、存在する配列の値だけに行きます。 – vlaz

答えて

2

これは活字体2.1で修正される必要があるknown and open issue with TypeScriptです。

次のコード:

[...(new Array(5))] 

がに変換:

(new Array(5)).slice(); 

しかし、ES6の意味は同じではありません。以下の出力を参照してください:

> [...(new Array(5))] 
[ undefined, undefined, undefined, undefined, undefined ] 
> (new Array(5)).slice(); 
[ , , , , ] 

期待される動作:

Array.apply(null, Array(5))