2016-10-28 12 views
1

I schreibe diese in Maschinenschrift:Maschinenschrift -> ES5 Ausgabe

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

Im Knoten Konsole er eine Reihe von 10 Nullen erzeugt:

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

Sobald in JavaScript transpilied, es produziert:

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

Aber das ist nicht äquivalent:

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

Ich hatte den Eindruck, dass Typoskript herzustellende iso-funktionalen Code soll. Lag ich falsch? Soll ich auf alles achten, was TS produziert?

Ich bin mit Knoten v7, tsc 1.20150623.0 mit dieser config:

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

ich dies nicht wiedergeben kann, ** aber **: Ihr TS, kopieren und einfügen, funktioniert gut. Die 'map' im JS-Formular schlägt fehl, sollte es aber nicht sein. Etwas Lustiges geht vor sich. – ssube

+1

@ssube: Der JS verhält sich wie erwartet. Die '.slice()' Methode ignoriert Löcher im Array, also ist es eine genaue Darstellung des Originals. Siehe [22.1.3.22 Array.prototype.slice (Start, Ende)] (http://www.ecma-international.org/ecma-262/6.0/#sec-array.prototype.slice) weisen speziell 15 (d), wobei * kPresent * das Ergebnis von * HasProperty * des aktuellen Index ist. –

+0

@squint nicht genau, 'slice' _does_ geben Sie das gleiche Array, das 10 leere Indices hat. '.map' ignoriert sie jedoch als" funktionale "Familie von Methoden -" forEach "," map "," reduce "," some "usw. gehen nur über Werte des vorhandenen Arrays hinaus. – vlaz

Antwort

2

Dies ist ein known and open issue with TypeScript, die in Typoskript 2.1 festgelegt werden sollen.

Der folgende Code:

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

übersetzt in:

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

Allerdings ist die ES6 Bedeutung nicht gleich. Siehe die Ausgabe unter:

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

Erwartetes Verhalten:

Array.apply(null, Array(5)) 
Verwandte Themen