TypeScript和Dart之间的区别


85

微软最近发布了Typescript,一种新的类似于JavaScript的编程语言。不久前,我听说过Dart,这是Google创建的一种新的编程语言,用于解决与Javascript有关的问题,例如性能,可伸缩性等。

两种新语言的目的在我看来都是相同的。

语言的目的是否相同?

它们之间的真正区别是什么?


Answers:


60

引用Bob Nystrom的话

如果您喜欢JS语义或您有大量的JS代码库投入使用,但是在大规模维护方面遇到了问题,TypeScript看起来不错。它的成功路径要平滑得多,因为它(主要是?)与JS向后兼容。

Dart冒险下注。我认为,它在很多方面都与JS距离较远,这在日常Dart程序员中最有效,但它使入门的门槛更高。但是,以更高的进入门槛作为回报,您可以获得:

  • 摇树
  • getter和setter(尽管我认为TypeScript最终会得到这些)
  • 运算符重载
  • 实际块范围,没有提升,没有IIFE小号
  • 本机VM
  • Sane相等语义
  • 没有奇怪的隐式转换疯狂
  • 词汇 this无处不在
  • 混合蛋白
  • 注解
  • 导入系统
  • 用户定义的下标运算符
  • 泛型,用物化
  • 后视镜
  • 更好的收藏班
  • 更干净的DOM API

另外,他在http://www.reddit.com/r/programming/comments/10rkd9/welcome_to_typescript/c6g37xd中写道:

我是Google Dart团队的成员,所以我很自然地从那个角度/偏见来看它。这里有些随机的东西引起了我的注意,主要是将它与Dart进行了比较。我只花了几分钟的时间浏览,所以不要太在意这些。

没有泛型

我猜有些类型比根本没有类型要好,但是丢失这些类型确实很困难。TypeScript确实具有内置的数组类型,并且对象类型涵盖了一些“地图”类型的用例。但是无法定义自己的泛型类型是一件麻烦事。文档说,添加后,泛型将可以使用类型擦除来工作,这是我期望的,因为它具有“编译为轻量级JS”样式,但这也可能会很痛苦。有时能够在运行时使用类型参数来做一些事情是很高兴的。

所有类型都可以为空

Dart是相同的方式。在这两种情况下,我都很难过。

类型注释语法很好

几乎所有带有可选类型注释的语言(ML,Scala,F#,Kotlin等)都带有“ ::后加后缀。.Dart尝试使用C样式类型注释,这会导致某些讨厌的情况。我喜欢TypeScript在这里的功能,特别是函数类型的语法:

function takeCallback(callback : (n : number) => number)
{ ... }

接口是结构类型的,类是名义类型的

考虑到它是JavaScript,这是有道理的,但是看起来很整洁。能够隐式实现接口是很好的。但是TypeScript似乎并没有让您走另一条路:给定一个类,就不能创建一个与它兼容的新类型,而不能因为品牌的原因而具体扩展它。在Dart中,借助隐式接口,您可以。

最佳普通类型可能会失败

这意味着这是一个类型错误:

[1, true]

您可以通过参数签名在接口中重载

这真的很酷,因为它为您提供了通过进行一些动态类型切换的函数调用获得更精确的类型推断流的方式。例如:

interface Doubler {
  double(s : string) : string;
  double(n : number) : number;
}

这样,当编译器看到对double的调用时,它可以根据推断的参数类型正确地为您提供精确的返回类型。我不确定如何实际实现一个实现该接口并让类型检查器满意的类。您实际上无法重载具体方法,而我花了五分钟尝试通过动态类型检查使其满意,这似乎没有用。

数组类型有专门的语法

有道理,因为没有泛型。它也很简洁,很好,但是我个人更喜欢通用泛型而不是一次性的特殊情况集合。

没有隐性的垂头丧气

Dart较常见的类型系统功能之一是分配兼容性是双向的:您可以不加警告地向下转换。除了典型的特殊情况外,TypeScript不允许这样做。您必须输入assert。就个人而言,我在这里喜欢TypeScript的方法。

箭头函数和词汇表this

这只是母性和苹果派。我喜欢。(Dart也具有此功能,并且这始终受词汇约束。)

总的来说,它看起来很整洁。如果您想要完全相同的JS语义(好的和坏的),但又希望散布一些类型,那么TypeScript似乎很不错。就像Closure Compiler,但语法更好。

如果您希望从JS的语法和语义上迈出更积极的一步,那么看来TypeScript不是那样。


17
什么是摇树?
citykid 2013年

4
有关摇树的更多信息:blog.sethladd.com/2013/01/…–
赛斯·拉德

19
“ Dart工具支持摇树,一种“摇晃”未使用的代码的技术,从而缩小了部署的应用程序的大小。我可以将丰富有用的库导入到我的应用程序中,但是仅包括我实际使用的功能在我生成的输出中。” thx
citykid 2013年

3
在预览状态下,Typescript的形状完美,可在明天发布的专业项目中使用。语言和工具的工作没有任何严重的问题,甚至根本没有任何问题。
13年

4
作为@JustAnotherUserYouMayKnowOrNot指出,打字稿加入0.9泛型blogs.msdn.com/b/typescript/archive/2013/06/18/...
乔恩·马贝

60

问题是“这些语言的目的是否相同吗?”,而真正的问题是:“我们如何从自己所在的位置使Web编程更好?”

两个项目都尝试这样做

  • 编程语言(TypeScript迈出了一步,但非常干净,Dart做出了更具革命性的变化,但仍在前进)

  • 与现有js代码的互操作性(TypeScript中的0转换可编译为js,在Dart中非常复杂,因为2个VM相互通信)

  • 软件工程实践(仅限Dart,Web组件和Shadow dom)

在过去的三天内,我深入研究了Dart,然后研究了TypeScript。我的CoffeeScript代码库使用了2000年代的代码行,太多了,无法用可爱但又过于蓬松的CoffeeScript处理。我面临的问题是,CoffeeScript缺少为中大型编程设计的语言所具有的功能:接口,模块,类型安全。但是,有一个甚至咖啡和JS更严重的问题:JS“这个指针”怪事影响了我的理智和CoffeeScript中没有什么帮助这里。

因此,经过3天的评估和使用,我的结果如下:

仔细阅读了本教程,阅读了1本书,略读了第二本书并尝试了演示。我以为,达特就是未来然后,我尝试将我的应用迁移到Dart。那就是我的热情从100下降到10。这就是为什么:

  1. 飞镖编辑器是达特程序的唯一方法。尽管存在Sublime Text插件,但它们不提供智能感知,代码完成功能(如果我错了,请纠正我)。但是,Dart编辑器的质量为pre alpha。虽然它确实支持超酷魔术,但是在编辑CSS文件时更新网页(!真的很酷),但它每分钟挂起或崩溃数次。因此,您输入5个字母2次,两次输入之间必须等待2秒或15秒。我有一个包含一些代码行的项目,所以不想等待当插入1000s行时发生的情况。在Dart Editor中将文件从一个文件夹移动到另一个文件夹时崩溃了。调试使用Dart Editor乍一看比我所知道的所有js调试工具都要好(chrome是我的选择),但是仍然缺少很多东西:没有即时窗口(目前这使js调试好得多),没有手表。

  2. 政治和逃生的可能性:有人说Apple,MS和Firefox永远不会提供Dart VM。好吧,我不太确定,但是至少对于苹果公司而言,目前看来这是非常确定的。对于其他人,它的可能性更大。因此,没问题,我们可以将Dart转换为JavaScript。这种集成的工作方式确实很棒,Dart维护了一个js存根,使js代码保持与Dart Editor的连接,因此print()在Dart Editor中仍然会显示一条很酷的语句。但是这里出现了:但是,这种转换后的代码占用的空间很大。150kB左右(缩小之前)。我没有过多地研究确切的大小,因此请不要在此问题上钉牢我。

  3. 语言成熟度。除了Dart编辑器每分钟3次突然出现在我脸上的严重问题之外,我还发现您发现有关Dart代码的每个来源都使用不同的Dart是不可接受的。语言每天都在变化。您找到5周前的帖子了吗?已经过时了。您尝试使用Google教程中的示例吗?由于API发生更改,因此至少有1个示例无法编译。即使是平凡的事情,例如将事件附加到DOM元素,也都在进行

  4. 与现有js库的集成有点涉及。2个虚拟机需要在此处进行通信,这很棘手。

总而言之,到目前为止,您不能严重使用Dart,并且由于1和3,进入Dart并不是一件太有趣的事情。随着时间的推移,这两个点都将消失。关于这2点,Google几天前发布了性能基准,表明其编译的js比手写的js更好。我的夸奖,干得好。如上所述,由于占用空间问题,加载时间可能仍然落后。但是,如果足迹代码被许多站点使用,则可能可以缓存该足迹代码,瞧,它们也会消失。

因此:我认为Dart是一个很棒的项目,目前使用它会带来很大一部分不可预见的风险,并且要到今年才能使其达到稳定的水平。

打字稿

评估TypeScript非常容易,只需1到2个小时,您便知道了一切。阅读语言规范文档和一本书(显示TypeScript)后,我知道了一切,并开始编程。然后,我惊讶地发现TypeScript对JavaScript的添加恰好满足了我增强客户端编程所必须满足的每一项严重需求。这里重点介绍:

  1. 接口。封装和接口使我可以轻松地构造代码。完善!

  2. 类状态。。TypeScript允许表达类的实例显式携带的状态,或者更好地实施它。与js或coffee相比,这是一大进步。

  3. this消除了疯狂。在箭头函数中,TypeScript使this指针像任何正常表现的公民一样。

  4. Intellisense编辑。TypeScript带有100%最完美的智能感知功能,当对C#进行编程时,它可以在Visual Studio中使用的微秒或毫秒范围内做出反应。所有重要的js库的 TypeScript标头也都存在。太棒了!

  5. 经验和风险。使用TypeScript的风险为零,语言定义明确,非常稳定,只是带有糖的js,没有什么不可预见的。

实际上,这些增强功能为我提供了我所需的一切。我将来唯一想看到的就是通用集合。但这就是花生。

那么性能呢?尽管我认为自己是性能怪胎,但我不相信有任何项目可以根据性能来选择技术。两者都在js liga中。

如果您对Web编程的未来感兴趣,那么两者都是很大的努力,TypeScript现在更加实用且可用,Dart是一个非常有趣的实验室项目,一旦成熟的编辑器和调试器可用并且可以使用的项目范围就可以使用。这将取决于政治。

无论如何,三个评估日都非常有趣,而且我学到了很多东西,如果您发现时间的话,Dart需要1天的时间,TypeScript需要2个小时才能发表自己的见解。试试吧。

2014年10月更新

过了一段时间,事后看来,Typescript是安全的稳定路线的假设是正确的。我刚刚发现有关Typescript,Dart和Closure的(非常)著名的陈述:

我一直对大型Web编程的挑战感兴趣。我相信Google Closure目前仍是进行大规模JavaScript / Web开发的最佳选择,但最终它会被不太冗长的东西所取代。尽管Dart表现出可观的前景,但我仍然对它生成的JavaScript的大小感到失望。相比之下,如果TypeScript可以直接转换为可以使用Closure Compiler的高级模式进行编译的JavaScript,那么我们可以从Closure中获得优化JavaScript的所有好处,而无需冗长。而且,由于TypeScript是JavaScript的超集,因此我相信它的语法扩展有时会使其成为ECMAScript标准,

http://blog.bolinfest.com/2013/01/generating-google-closure-javascript.html

迈克尔·博林(Michael Bolin)是(ex)google(ex)fb的长期前端英雄,也参与了Google封闭(请获取有关Closure的书)。

Google Traceur

谷歌今天采用ECMA Script 6的方式是其Traceur项目:https//github.com/google/traceur-compiler

与Typescript相比,到目前为止,工具支持可能远远落后。从好的方面来说,采用过冷的未来js语言改进(例如迭代器或理解)更快。

Facebook Flow,Google AtScript

提供与TypeScript类似的功能。

微软的乔纳森·特纳(Jonathan Turner)说:“人们可能想知道这些不同的JavaScript类型检查解决方案是什么以及如何处理。一个好消息是,微软,Facebook和Google正在合作进行这些工作:

TypeScript团队与Flow和AtScript团队合作,以帮助确保JavaScript类型社区已经创建的资源可以在这些工具中使用。这些项目可以互相学习很多,我们期待着共同努力,并为JavaScript社区创建最好的工具。从长远来看,我们还将努力将这些工具的最佳功能集成到ECMAScript(JavaScript背后的标准)中。

关于fb流的infoq文章


我要等到Google开始将Dart用于自己的大部分项目(如果适用)时,换句话说就是开始食用狗食。Dart听起来也像Silverlight,只是没有XAML部分,只有一种语言,但是更好地与JS / HTML集成。
2013年

1
是的,Dart是我们将来可以在实验室中观察和等待的东西,而Typescript现在可以进行专业开发了。因此,将Typescript与Dart进行比较,就是将苹果与橙色的幼苗进行比较。
13年

7
这是一个非常有见地的答案。谢谢你写
Darshan Sawardekar

2
不知道打字稿如何“修复” this上下文,因为您仍然必须将在方法内部声明的回调函数与方法的this上下文绑定以便访问类属性。那怎么“固定”任何东西?
nurettin

1
有效点。尽管 有时仍需要绑定但这箭头函数内部的别名,因此至少可以缓解此问题。
citykid 2014年

17

引用Scott Hanselman的话:

人们已经将TypeScript与Dart进行了比较。那是将苹果与化油器进行比较。TypeScript基于JavaScript构建,因此没有JS互操作问题。Dart是从头开始编写的本地虚拟机。Dart与JavaScript互操作...但是不是JS。例如,它甚至不使用JavaScript数字类型。

为什么打字稿必须是回答什么?


8
老实说,我有点困惑。TypeScript也不是真正的JS,对吗?var x = {}; x.foo = 5; //Doesn't work in typescriptvar e = window.event ? window.event : e; //Doesn't work in typescript上面的例子将失败打字稿编译器。我想念什么吗?我不能只是随意插入我的JavaScript并使用类型。我必须学习一些新的语法并使用类型来构造所有内容。
aikeru

@aikeru嗯,你是对的。它似乎确实消除了JS的某些功能。我本打算使用这个新工具,但是现在我有了第二个想法。
2012年

3
不同意。这就像将苹果与梨或化油器与燃油喷射进行比较。关于这两者的很多事情自然会导致很多人同时考虑它们。
hippietrail

从记录来看var x = {}; x['foo'] = 5;,这种方法确实有效var y:any = {}; y.foo = 5;,但确实如此,但是我发现您对此是正确的感到有些惊讶-感知到的{}is {}而不是any。可能是类型推断问题。我在这里发布了问题-我们将看到他们的回应。
mindplay.dk 2013年

3

最近我不得不根据自己的发现来进行讨论。

1:TypeScript

MS采取了一种不错的方法,因为您可以轻松地跳入TS和JS。我们主要在开发中使用AngularJS,并且发现没有很多文档将Angular转换为TypeScript。将TypeScript集成到我们的Dev工作流程中,这是一个很好的补充。

第二名:飞镖

Dart对Google而言具有讽刺意味。也许他们不记得activeX和所有噩梦,它们试图使应用程序在除可怕的IE 5或IE 6之外的任何其他版本上运行。从那一天开始,MS花费了很多年的时间。

Dart作为一种“概念上”的语言,似乎试图结合一些不错的OOP功能。注释等对于Javascript是一个不错的想法。

问题是,很难想象有足够的带宽来创建新的编辑器,新的语言,跨浏览器的新vm,其他IDE的插件,编译器以转换为javascript(大小不超过mega),转换或创建新的dart库。替换成千上万个当前的js库,让某人决定聚合物或指令,将dartlang网站转换为使用dart,这是我能想到的。

目前,尝试在非琐碎的应用程序中使用Dart的概念令人恐惧。

最重要的是,这些ES6并不遥远。ES6带来了Dart试图修复的ES5中存在的许多功能。ES6上市后的价值主张是什么?至少在这个时候,一旦ES6发布,您在TypeScript中必须做的唯一更改就是选择一个不同的编译器作为目标。

只是为了澄清我是专业MS人士。MS生产了一些不错的产品,并且在解决OSS社区过去的错误方面取得了长足的进步。我仍然很少使用MS以外的TypeScript以外的任何东西。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.