2015-09-05 11 views
2

Вы можете настроить TypeScript для вывода ES5 или ES6. Пока вы хотите запускать свое приложение на платформе, которая не поддерживает ES6, вы должны скомпилировать ES6 на ES5 с помощью компилятора, такого как Traceur (и включая библиотеку времени трассировки Traceur).В чем преимущество использования как TypeScript, так и Traceur?

Есть ли какое-либо преимущество в этом, а не просто говорить TypeScript для вывода ES5? (Я не ожидаю, что приложение когда-либо будет нацелено на собственные платформы ES6)

Насколько я понял, вы не можете написать программу в TypeScript (1.5), которая не может работать на ES5 (учитывая, что программа компилируется, и вы включая правильные библиотеки). Я ошибаюсь?

ответ

4

Причина использование Бабеля или трейсера над машинописью

До сих пор команда машинописи выбрала не вносит сгенерированный код зависит от среды выполнения. Некоторые функции 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[] и он производит только код для массива.

+1

Так что это, по-видимому, аргумент для использования флага ES5 в TypeScript. Но мой главный вопрос состоял в том, есть ли веская причина сделать это по-другому, используя флаг ES6, а затем Traceur. –

+0

ok, можно ли написать программу в TypeScript, которая будет компилироваться без ошибок в ES5, но на самом деле не будет запущена на ES5, если вы используете ES6-функцию, такую ​​как ES6 Promises? –

+0

Чтобы частично ответить на мой собственный комментарий: если вы используете ES6 Promises, компилятор TypeScript будет генерировать ошибки, если у вас установлен флаг ES5, но если у вас есть флаг ES6. Поэтому компилятор сообщает по-разному в зависимости от цели. Опять же: есть ли способ написать программу, которая будет компилироваться с ES5, но не будет запущена на ES5? –

 Смежные вопросы

  • Нет связанных вопросов^_^