理由使用巴贝尔或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[]
,它只产生数组的代码。
所以这似乎是在TypeScript中使用ES5标志的一个参数。但是我的主要问题是,如果有任何好的理由以其他方式使用ES6标志,然后使用Traceur。 –
好的,那么是否有可能在TypeScript中编写一个程序,该程序可以毫无误差地编译到ES5,但如果使用ES6 Promise等ES6功能,实际上不会在ES5上运行? –
要部分回答我自己的意见:如果使用ES6 Promises,如果设置了ES5标志,则TypeScript编译器将生成错误,但如果您有ES6标志,则不会生成错误。因此,根据目标编译器的报告会有所不同。 再说一遍:有没有什么方法可以编写一个可以用ES5编译但不能在ES5上运行的程序呢? –