Причина использование Бабеля или трейсера над машинописью
До сих пор команда машинописи выбрала не вносит сгенерированный код зависит от среды выполнения. Некоторые функции ES6 можно легко использовать с TS через полисы (пример: ES6 Promises). Другие функции требуют сотрудничества транспилятора и полиполя (пример: генераторы ES6). Использование генератора с TS возможно (начиная с TS 1.6), но цель должна быть ES6. Это хорошая причина использовать Вавилон или Трейсер.
Причины не использования Бабеля или трейсер над машинописью
Но есть и другие веские причины не использовать Бабель и трейсер. Просто попробуйте перевести код ES6.
ES6 Код:
let list = ['ab', 'cd'];
for (let item of list) {
console.log(item);
}
ES5 производства машинописи (с помощью the Playground):
var list = ['ab', 'cd'];
for (var _i = 0; _i < list.length; _i++) {
var item = list[_i];
console.log(item);
}
ES5 производства Traceur (с использованием the REPL):
$traceurRuntime.ModuleStore.getAnonymousModule(function() {
"use strict";
var list = ['ab', 'cd'];
var $__4 = true;
var $__5 = false;
var $__6 = undefined;
try {
for (var $__2 = void 0,
$__1 = (list)[$traceurRuntime.toProperty(Symbol.iterator)](); !($__4 = ($__2 = $__1.next()).done); $__4 = true) {
var item = $__2.value;
{
console.log(item);
}
}
} catch ($__7) {
$__5 = true;
$__6 = $__7;
} finally {
try {
if (!$__4 && $__1.return != null) {
$__1.return();
}
} finally {
if ($__5) {
throw $__6;
}
}
}
return {};
});
//# sourceURL=traceured.js
ES5 производства Бабель (с использованием the REPL):
'use strict';
var list = ['ab', 'cd'];
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = list[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var item = _step.value;
console.log(item);
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator['return']) {
_iterator['return']();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
Решения от трейсер и Вавилонской некрасиво, так как переменная list
может быть an ES6 iterable и эти transpilers не знают о типах. TypeScript указывает, что тип list
представляет собой массив string[]
и он производит только код для массива.
Так что это, по-видимому, аргумент для использования флага ES5 в TypeScript. Но мой главный вопрос состоял в том, есть ли веская причина сделать это по-другому, используя флаг ES6, а затем Traceur. –
ok, можно ли написать программу в TypeScript, которая будет компилироваться без ошибок в ES5, но на самом деле не будет запущена на ES5, если вы используете ES6-функцию, такую как ES6 Promises? –
Чтобы частично ответить на мой собственный комментарий: если вы используете ES6 Promises, компилятор TypeScript будет генерировать ошибки, если у вас установлен флаг ES5, но если у вас есть флаг ES6. Поэтому компилятор сообщает по-разному в зависимости от цели. Опять же: есть ли способ написать программу, которая будет компилироваться с ES5, но не будет запущена на ES5? –