2015-09-05 15 views
2

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

有没有这样做的好处,而不是简单地告诉TypeScript输出ES5? (我不希望该应用程序将永远只针对本地ES6平台)

据我所知,你不能在TypeScript(1.5)中编写一个程序不能在ES5上运行(假设程序编译和你包括正确的库)。我错了吗?

回答

4

理由使用巴贝尔或Traceur在打字稿

到目前为止,打字稿的团队选择不使生成的代码依赖于运行时的。通过polyfills可以轻松将TS6的某些功能用于TS(例如:ES6 Promises)。其他功能需要配合转播机和polyfill(例如:ES6发电机)。使用带有TS的发生器是可能的(自TS 1.6开始),但目标必须是ES6。这是使用Babel或Traceur的一个很好的理由。

理由使用巴贝尔或Traceur在打字稿

但也有其他很好的理由不使用巴贝尔和Traceur。只是尝试传输一些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; 
     } 
    } 
} 

从Traceur和巴贝尔的解决方案是丑陋的,因为变量list可能是an ES6 iterable这些transpilers不知道的类型。 TypeScript推断list的类型是一个数组string[],它只产生数组的代码。

+1

所以这似乎是在TypeScript中使用ES5标志的一个参数。但是我的主要问题是,如果有任何好的理由以其他方式使用ES6标志,然后使用Traceur。 –

+0

好的,那么是否有可能在TypeScript中编写一个程序,该程序可以毫无误差地编译到ES5,但如果使用ES6 Promise等ES6功能,实际上不会在ES5上运行? –

+0

要部分回答我自己的意见:如果使用ES6 Promises,如果设置了ES5标志,则TypeScript编译器将生成错误,但如果您有ES6标志,则不会生成错误。因此,根据目标编译器的报告会有所不同。 再说一遍:有没有什么方法可以编写一个可以用ES5编译但不能在ES5上运行的程序呢? –

相关问题