首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同时使用TypeScript和Traceur的优点是什么?

同时使用TypeScript和Traceur的优点是什么?
EN

Stack Overflow用户
提问于 2015-09-05 06:53:10
回答 1查看 475关注 0票数 2

您可以将TypeScript配置为输出ES5或ES6。只要您想在一个不支持ES6的平台上运行您的应用程序,您就必须使用像Traceur这样的编译器将ES6编译成ES5 (并包括Traceur运行时库)。

这样做有什么好处,而不只是让TypeScript输出ES5?(我不期望应用程序只针对本机ES6平台)

据我所知,您不能用TypeScript (1.5)编写不能在ES5上运行的程序(考虑到程序编译并包含正确的库)。我说错了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-05 07:32:46

在TypeScript上使用Babel或Traceur的理由

到目前为止,类型记录团队选择不使生成的代码依赖于运行时。ES6的一些特性可以很容易地通过多填充(例如: ES6承诺)与TS一起使用。其他特性需要转换程序和多填充(例如: ES6生成器)的协作。在TS中使用生成器是可能的(因为TS1.6),但目标必须是ES6。这是使用Babel或Traceur的一个很好的理由。

在TypeScript上不使用Babel或Traceur的原因

但是还有其他的理由不使用Babel和Traceur。只需尝试传输一些ES6代码。

ES6代码:

代码语言:javascript
复制
let list = ['ab', 'cd'];
for (let item of list) {
    console.log(item);
}

ES5由TypeScript生成(使用游乐场):

代码语言:javascript
复制
var list = ['ab', 'cd'];
for (var _i = 0; _i < list.length; _i++) {
      var item = list[_i];
      console.log(item);
}

ES5由Traceur生产(使用REPL):

代码语言:javascript
复制
$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

由Babel生产的ES5 (使用REPL):

代码语言:javascript
复制
'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;
        }
    }
}

Traceur和Babel的解决方案很难看,因为变量list可以是一个可迭代的ES6,而这些转发器不知道类型。TypeScript推断list的类型是数组string[],它只生成数组的代码。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32410371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档