我应该使用TypeScript吗?或者只能使用ES6?

294

我每天的工作是使用AngularJS开发客户端应用程序。我们正在评估是否使用TypeScript。我对TypeScript进行了一些研究,发现几乎我需要的每个JavaScript包都必须有定义类型文件。如果我想尝试一些新东西而他们没有相应的定义文件,这非常不方便,令人沮丧。(即使当前版本的jQuery定义文件也会在我想使用TypeScript 1.5 beta时出现问题)。我开始看ES6,它看起来很像TypeScript。我应该使用ES6吗?另外,我听说angular 2将全面支持TypeScript,这是我应该继续使用TypeScript的一个原因吗?


11
使用新的库时不需要每次都有一个定义文件。如果要在没有类型的情况下使用库,可以编写 declare var MyNewLibraryName: any;,然后尽情使用它而不会受到编译器的投诉。 - David Sherret
2
随着关闭此问题的投票,我建议询问与每种方法相关的利弊,而不是询问哪种方法最好,这样您就是在寻求信息而不是意见。 - Brocco
1
TypeScript更新了JavaScript的新版本功能,适用于所有主要浏览器。我的建议是使用TypeScript,并根据您的目标浏览器编译为JavaScript版本。(当然,即使将JavaScript从一个版本转换为另一个版本也很容易) - bhv
如果你不在意能否正确地检查你的代码,而且你希望Immutable.js非常难以使用,你喜欢编写样板文件,认为DRY被高估了,实际上你更喜欢重复自己,你喜欢为其他人的代码编写类型定义,并且你喜欢在类型在你下面发生变化时进行管理,你喜欢在两个不同的文本编辑器之间切换,因为没有一个能正常工作,那么就选择Typescript吧。但是如果你理智的话,就选择ES6/7和Babel。 - gargantuan
2个回答

667

使用ES5,ES6和TypeScript之间的决策树

你介意有一个构建步骤吗?

  • 是 - 使用ES5
  • 否 - 继续

你想使用类型吗?

  • 是 - 使用TypeScript
  • 否 - 使用ES6

更多详情

ES5是您今天在浏览器中所知道和使用的JavaScript,它就是它本身,并且不需要构建步骤来将其转换为可在今天的浏览器中运行的内容。

ES6(也称为 ES2015 )是JavaScript的下一代版本,但不能在今天的浏览器中运行。有很多转译器可以导出在浏览器中运行的ES5。它仍然是一种动态(即:非强类型)语言。

TypeScript提供了一个可选的类型系统,同时引入了未来版本的JavaScript(ES6和ES7)功能。

注意:许多转译器(例如babel,TypeScript)允许您在今天使用未来版本的JavaScript功能,并导出仍将在今天的浏览器中运行的代码。


6
并不是那么简单。还有许多其他因素。 - RaoulRubin
17
那是真的,还有很多其他因素,但对于这个封闭性问题,它至少为决策过程提供了一个起点。 - Brocco
3
@RavinderPayal提出了一个有趣的问题,Brocco。从市场的角度来看,TS相对于es5或es6等技术,到底有什么价值? - J.Wells
3
好的,这篇帖子已经有几年了。现在快进到今天,也就是2017年9月28日。大多数浏览器是否支持ES6? - Dewey Banks
1
@DeweyBanks http://kangax.github.io/compat-table/es6/ - Ciarán Bruen
显示剩余8条评论

116

我已经在我的当前angular项目中使用TypeScript一年半了,虽然有时会出现一些定义的问题,但是DefinitelyTyped项目非常出色地跟进了大多数流行库的最新版本。

话虽如此,从普通JavaScript转换到TS还需要一定的学习曲线,您应该考虑您和您的团队进行这种转换的能力。此外,如果您要使用angular 1.x,则大多数在线示例都需要您将它们从JS翻译成TS,而且目前关于使用TS和angular 1.x的资源不是很多。

如果您计划使用angular 2,则有许多使用TS的示例,我认为团队将继续以TS提供大部分文档,但您肯定不必使用TS来使用angular 2。

ES6确实具有一些不错的功能,我个人计划更加熟悉它,但我认为它目前不是一种适用于生产的语言,主要是由于当前浏览器的支持不足。当然,你可以用ES6编写你的代码,然后使用转译器将其转换为ES5,这似乎是现在流行的做法。

总的来说,我认为答案将取决于您和您的团队习惯学习哪种语言。我个人认为TS和ES6都会得到良好的支持和长期的发展,但我更喜欢TS,因为您倾向于更快地获得语言功能,并且现在工具支持(在我看来)要好一些。


40
ES6在浏览器上没有支持?TypeScript和ES6都需要转译器。这意味着您不能在Web上运行TS或ES6,而是使用类似Babel的工具。将TS转换成Angular2只是为了满足Google和微软之间的政治关系。 - STEEL
42
@STEEL,您误解了,我并不是一位政治人物。您是在回复我一年前留下的答案,当时 ES6 的支持非常有限。您可以自由地认为 TS 和 Angular 2 的决定具有政治性,但这并不能改变我的观点:TS 是针对该语言编写的,Angular 2 团队鼓励使用它。 - Kent Cooper
18
这段话来自两年前,但时间已经证明标准最终会占据主流地位。现在,大多数浏览器都原生支持ES6,包括类、箭头函数等。最终,我们将达到一个点,在这个点上,浏览器将原生支持足够好的JavaScript版本,使得转译器不再必要。但TypeScript始终需要转译器。 为什么这很重要?因为作为Web开发人员,我们的职责是推动Web前进,而这是通过支持标准来实现的。 - monzonj
4
ES6并不支持真正的“编译时”类型安全,这是有点遗憾的。ES6有很多好东西,但事实上我不能说“这个参数是一个字符串(或X类的实例),该死”,并且能够在构建过程中验证它,对于大型程序(无论是前端还是后端)来说仍然存在问题。 - Brad Peabody
如果你真的想要在ES6中添加类型支持,可以使用像Flow Type这样的工具。直到ES6在所有浏览器中变得普及,你的工具链将包括Flow->ES6->Babel,这是很多间接性,但它能够完成工作,我认为目前这是一个非常流行的链。 - Prahlad Yeri

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