我应该使用Traceur还是TypeScript来针对ES5,但为ES6做好准备?

19
我正在处理一个大型代码库,使用Typescript可能会有好处。但是考虑到最终世界将转向ES6,所以我应该引导开发朝向Traceur吗?
我不想改变Typescript的实现以便支持ES6(当它准备就绪时),所以我现在倾向于选择Traceur。
请问有什么建议吗?

你对ES6语言特性感兴趣,还是对类型安全感兴趣?TypeScript可以提供编译时类型安全,而ES6没有这样的概念。 - Jean-Philippe Pellet
@Jean-PhilippePellet:吹毛求疵:TypeScript非常有用,但实际上并没有以任何有意义的方式提供类型安全。 - Andreas Rossberg
@AndreasRossberg,在看了您的个人资料之后,我不确定我敢与您意见相悖,但是那么你会如何称呼防止字符串乘法的操作呢? - Jean-Philippe Pellet
@Jean-PhilippePellet,TS并不能防止这种情况,至少在一般情况下是如此。它的类型系统不是_完全安全_的,因此即使是类型为“number”的表达式也可能被计算为字符串。就像我说的那样,我只是在挑刺,但通常对类型安全的定义需要满足完全安全性。 - Andreas Rossberg
1
@Jean-PhilippePellet,噢,在TS中有很多其他会破坏可靠性的东西。例如,(可变)对象上的子类型:var x: {a:number} = {a: 0}; var y: {a:Object} = x; y.a = "boo"; x.a * 2 - Andreas Rossberg
显示剩余4条评论
6个回答

30

我绝对不同意 TypeScript 和 Traceur 相差很大的观点,TypeScript 是带有类型的 ES5,而 Traceur 则是关于 ES6 的。

一方面,有一个兼容 ES6 的 TypeScript 2.0 正在进行中。另一方面,Traceur 中有几个在文档中标记为实验性的功能,即 类型和注释。结果发现,类型与 TypeScript 类型非常相似,而注释则与 ES6 和 TypeScript 都无关。因此,Traceur 更多地只是 ES6,已经有了一个名称:AtScript。是的,我们又有了另一个语言扩展 :-)

这里有一张来自Miško Hevery的演讲的幻灯片,它展示了实际发生的事情,当TypeScript 2.0发布后,这张幻灯片将完全有效。

AtScript and TypeScript as ES6 extensions

无论您决定使用什么,重要的是要注意:它们是子集,您可以编写ES5 / ES6 JS代码,并且它将是有效的TypeScript代码,您可以编写TypeScript代码,并且它将是有效的AtScript代码。
回到您的问题,我建议谦虚地从ES6开始,使用已关闭实验性功能的Traceur(现在非常稳定),并根据需要进行扩展,因为这不是那么激进的决定,不会限制您的选择,并留有未来发展的空间。
更新:在2015年初,我还建议关注6to5项目(现在更名为Babel)作为Traceur的替代方案。它发展迅速,并提供一些不错的功能,如生成代码的可读性以及对node.js和构建系统的更好支持。

9
UPD2: AtScript和TypeScript正在合并,据ng-conf 2015宣布,因此您将获得TypeScript的所有好处 :) 另外,TypeScript将用于创建Angular 2,这意味着它将被另一个大型项目采用。 - Lski
6
6to5 项目绝对值得关注,但最近已更名为Babel - Lski
尽管经常有这样的说法,但并非所有的ES5代码都是有效的TypeScript。 function testFunc(a, b) { console.log(a); } testFunc('hello'); /* 错误 */ testFunc('hello', 'goodbye', 'go away'); /* 错误 */ - bradw2k

12

TypeScript和Traceur有完全不同的目标,不能按照您试图比较它们的方式进行比较。

TypeScript是EcmaScript的超集,添加了严格的类型。它包括一些ES6的功能,但其主要目标是为语言增加严格类型(同时与ES6对齐),而不是提供ES6支持。

相反,Traceur是未来EcmaScript到当前EcmaScript编译器。它不会添加任何不在下一个版本的EcmaScript中提出的内容。

如果您只想今天写EcmaScript 6,请使用Traceur。如果您想要可选的强制类型和所有相关好处,以及一些ES6功能,请使用TypeScript。


1
我理解你的观点,但我不确定我会说它们是完全不同的目标。两者的主要目标之一都是使开发人员更轻松地开发大规模应用程序。并不是为了过于简化,但TypeScript认为强类型系统是其中一个必不可少的组成部分,而ES6则更全面地考虑了语言未来的发展方向。 - zumalifeguard
相比之下,Traceur是一种将未来的EcmaScript编译成当前版本EcmaScript的编译器。它不会为语言添加任何尚未被提议用于下一个EcmaScript版本的内容。但实际上,它确实添加了一些新特性...请参见https://github.com/google/traceur-compiler/wiki/LanguageFeatures - Clintm
@Clintm Traceur的目标是“将JavaScript.next编译为当今的JavaScript”。除了注释提案之外,Traceur所做的一切都是为Harmony提出的,并且已经包含在ES规范中或者是Harmony的草案,因此根据每个项目的声明目标,这个回答是准确的。一个例外并不会使更大的总体目标失效。 - C Snover

9

提醒:TypeScript的下一个版本(2.0)正在开发中,专注于ES6兼容性:http://typescript.codeplex.com/wikipage?title=Roadmap

这里更新了帖子:

http://blogs.msdn.com/b/typescript/archive/2014/10/22/typescript-and-the-road-to-2-0.aspx

从TypeScript 1.5到TypeScript 2.0

当我们着眼于2.0发布时,我们除了主要目标是为JavaScript开发带来良好的工具之外,还专注于两个目标。第一个是与ES6对齐。与ES6对齐使TypeScript成为下一代JavaScript的超集,打开了使用新代码模式(如解构、字符串模板、Promise、迭代器等)的道路,除了TypeScript已经支持的特性,如类和lambda函数等。我们还与Flow和Angular团队合作,确保TypeScript是处理更广泛的库的最佳语言,包括声明性框架,如即将推出的Angular 2.0版本。


1
是的,我又回到了TS编程语言,特别是因为它产生的代码质量很高。 - Nikos
那个路线图已经有六个月了,它使用了“与ES6对齐”的短语,除非有更具体的信息,否则这个短语是如此模糊,以至于毫无意义。 - user663031
@torazaburo,这是6个月前发布的内容;)。我刚刚更新了一篇来自另一天(10/22)的博客。 - John
嘘,http://stackoverflow.com/review/suggested-edits/6075577 可能是一个不错的编辑,可以融入到你的答案中。 - user1228

0
对于大型系统,我一定会推荐使用TypeScript。
当您有一个团队共同合作时,TypeScript将为您提供现代计算机语言的所有优势,包括ES6兼容性(基于Microsoft路线图),但具有严格的类型和代码完成优势。

1
你确定你真的懂 TypeScript 吗?看一下 TypeScript 的路线图吧:https://typescript.codeplex.com/wikipage?title=Roadmap
  • 与 ECMAScript 6 对齐
- Nati Krisi
2
你说的是“给你”,而不是“将来会给你”,在未来的某个未知程度上。甚至没有人知道“对齐”是什么意思,尽管它肯定不意味着“完全兼容”,因为 TypeScript 中有些方面永远无法实现完全兼容。 - user663031
3
我的快乐并不重要,SO读者获得准确信息才是最重要的。TypeScript从未表示过它打算与ES6兼容,正如我所提到的,有结构性的原因使它不能这样做,除非改变其基本特性。因此,说选择TS会给你ES6兼容性是事实上错误的。它不会。在路线图中,“与ES6对齐”这个短语最好理解为“在可行的情况下采用一些来自ES6的想法,例如推导和字符串模板,并可能调整模块语法以更像ES6。” - user663031

0

Traceur和Typescript的转译功能非常相似,各有优缺点。

我认为需要更深入地回答、分析和比较的主要问题是:“它们的支持者是谁?”和“它们的历史是什么?”

Q1:嗯,两家公司都是大型知名企业,在技术方面投入巨大,拥有强大的员工队伍来推动他们的转译工具。Traceur由Google支持,而Typescript则由Microsoft支持。

Q2.1:Google一直以来都是开源框架的坚定支持者,例如Chromium(Google Chrome浏览器的开源基础)和成千上万个可用的免费API,几乎全部基于开放标准。Traceur遵循这一逻辑,采用ECMAScript 6规范的指南,预测未来修订并确保其兼容性。

Q2.2:Microsoft一直以来都是将标准包含在自己的平台中并扩展它们的公司,从而使客户对其平台产生依赖,并不尊重其他市场参与者共享标准化的愿景。Typescript的主要目标是将市场上其他编译器与其JScript.NET编译器的语法和特性兼容,而不是与ECMAScript 6兼容。任何提到ECMA的都只是“蚂蚁的糖”。

Typescript的实时输入解析和高级代码完成对于小型项目来说是一个相当大的优势,但是对于大型项目来说,在架构定义过程中需要做出正确的决策,否则整个项目可能会受到编译器过时或停用以及不符合标准的影响,这取决于唯一供应商。

然而,ECMAScript 6的许多功能只在Firefox 33和Chrome 38当前版本(2014-10)上实现。

http://kangax.github.io/compat-table/es6/


我肯定不是微软的粉丝(事实上,我为其竞争对手工作),但我认为这种比较有很多不公平之处。首先,将恶意归咎于微软,将善意归于谷歌,这与当前情况背道而驰,后者正在迅速转向专有(其中许多提到的开放API现在已经被弃用),而前者则朝着开放的方向发展。另一方面,比较Traceur和TypeScript是不公平的,因为Traceur还不支持另一个专有语言版本,但是标准ES6(还有其他的转译器,例如Babel)。 - mcepl

0

我肯定会推荐使用ES6。

对于任何其他看到这个问题的人,请去查看tagtree关于ES6特性的视频。

要了解模板字符串箭头语法解构,请查看免费的tagtree教程录屏,无需注册。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接