2016-10-28 3 views
1

Я пишу это в машинописи:Машинопись -> ES5 вопрос

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

В консоли узла он производит массив из 10 нулей:

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

После transpilied в JavaScript, она производит:

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

Но это не эквивалентно:

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

У меня создалось впечатление, что машинопись должна содержать изофункциональный код. Был ли я неправ? Должен ли я обратить внимание на все, что производит TS?

Я использую узел v7, TSC 1.20150623.0 с этой конфигурацией:

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

Я могу воспроизвести это, ** но **: ваши TS, копировать и вставить, работает отлично. «Карта» в форме JS терпит неудачу, но этого не должно быть. Что-то смешное происходит. – ssube

+1

@ssube: JS ведет себя так, как ожидалось. Метод '.slice()' игнорирует дыры в массиве, поэтому это точное представление оригинала. См. [22.1.3.22 Array.prototype.slice (начало, конец)] (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

Это known and open issue with TypeScript, который должен быть закреплен в машинописном 2.1.

Следующий код:

[...(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)) 
Смежные вопросы