微软最近发布了Typescript,一种类似于JavaScript的新编程语言。
前一段时间,我听说Dart,它是Google为解决与Javascript有关的性能,可伸缩性等问题而创建的一种新编程语言。 。

两种新语言的目的在我看来都是一样的..您怎么看?

这些语言的目的是否相同?

它们的真正区别是什么?

评论

在此处查看讨论内容:programmers.stackexchange.com/questions/166978/…

#1 楼

引用Bob Nystrom的话:


如果您喜欢JS语义或拥有大量的JS
代码库但需要维护,则TypeScript看起来不错。
大规模的问题。它的成功之路要顺畅得多,因为它
(主要是?)与JS向后兼容。

Dart冒险下注。它在很多方面都与JS距离较远,
作为日常Dart程序员,大多数情况下都很好,但是它使进入的门槛更高。但是作为更高的进入壁垒的回报,您会得到:


摇晃树
吸气和吸气(虽然我认为TypeScript最终会得到这些)
/>运算符重载
真正的块作用域,没有提升,没有IIFEs
本机VM
Sane等式语义
没有奇怪的隐式转换疯狂

用词法约束this处处
Mixins
注释
导入系统
用户定义的下标运算符
具有泛化功能的泛型
镜子
集合类
更清洁的DOM API



他还写在http://www.reddit.com/r/programming/comments/10rkd9/welcome_to_typescript / c6g37xd:


我在Google的Dart团队中任职,所以我很自然地从那个角度/偏见来看它。这是一些随机的东西引起了我的注意,主要是
与Dart进行比较。我只花了几分钟的时间,所以不要
认真对待任何一个...

没有泛型

我想有些类型是总比没有类型好,但是
失去这些类型确实很困难。 TypeScript确实具有内置的array
类型,并且对象类型涵盖了一些“ map”类型的用例。但是
不能定义自己的泛型类型很麻烦。文档说
,添加后,泛型将使用类型擦除来工作,这就是我想要的
期望它具有“编译为轻量级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不是那样。


评论


什么是摇树?

–citykid
13年4月1日在19:48

有关摇树的更多信息,请访问:blog.sethladd.com/2013/01/…

–塞思·拉德(Seth Ladd)
13年4月1日在22:30

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

–citykid
13年4月1日在22:47

在预览状态下,Typescript的形状非常完美,可用于明天发货的专业项目。语言和工具可以正常工作,甚至根本没有任何问题。

–citykid
13年4月6日在18:41

正如@JustAnotherUserYouMayKnowOrNot指出的那样,TypeScript在0.9blogs.msdn.com/b/typescript/archive/2013/06/18/…中添加了泛型。

–琼·马贝(Jon Mabe)
2014年1月21日在20:59

#2 楼

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

两个项目都试图做到这一点考虑


编程语言(TypeScript迈出了很小但很干净的一步,Dart做出了仍在发展的更具革命性的举动)
与现有js代码的互操作性(TypeScript中的0过渡)可以编译成js,在Dart中很复杂,因为2个VM相互通信)
软件工程实践(仅Dart,Web组件和shadow dom)

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

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

Dart

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


Dart编辑器是编写Dart的唯一方法。存在Sublime Text插件时,它们不提供智能感知,代码完成(如果我错了,请纠正我)之类的功能。但是,Dart编辑器的质量为pre alpha。它确实支持超酷魔术,例如在编辑CSS文件时更新网页(!真的很酷),但它每分钟挂起或崩溃数次。因此,您输入5个字母2次,两次输入之间必须等待2秒或15秒。而且我有一个包含一些代码行的项目,因此不想等待当插入1000s行时发生的情况。在Dart Editor中将文件从一个文件夹移动到另一个文件夹时发生崩溃。乍看之下,使用Dart Editor进行调试要比我所知道的所有js调试工具都要好(chrome是我的选择),但是仍然遗漏了很多东西:没有即时窗口(目前这使js调试要好得多),没有手表。
政治和逃生的可能性:有人说Apple,MS和Firefox永远不会提供Dart VM。好吧,我不太确定,但至少对于苹果公司而言,目前看来这是非常确定的。对于其他人,它的可能性更大。因此,没问题,我们可以将Dart转换为JavaScript。集成的工作方式确实很棒,Dart维护了一个js存根,使js代码保持与Dart Editor的连接,因此print()语句仍然出现在Dart Editor中,很酷。但是这里出现了:但是,这种转换后的代码占用的空间很大。 150kB左右(缩小之前)。我没有对确切的尺寸进行过多挖掘,所以请不要在这个问题上钉死我。
语言成熟度。除了Dart编辑器每分钟3次突然出现在我脸上的严重问题之外,我还发现您发现有关Dart代码的每个来源都使用不同的Dart是不可接受的。语言每天都在变化。您发现5周前的帖子了吗?已经过时了。您尝试使用Google教程中的示例吗?由于API发生更改,因此至少有1个示例无法编译。即使是平凡的事情,例如将事件附加到DOM元素,也都可以顺利进行。
与现有js库的集成有点涉及。 2个虚拟机需要在此处进行通信,这很棘手。

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

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

TypeScript

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


接口。封装和接口使我可以轻松地构造代码。完美!
类状态。TypeScript允许表达类的实例显式携带的状态,或者更好地强制执行它。与js或coffee相比,这是一大进步。
this呼叫疯狂得到缓解。在箭头函数中,TypeScript使this指针像任何正常表现的市民一样。
编辑器,Intellisense。 TypeScript带有100%最完美的智能感知功能,当对C#进行编程时,它可以在Visual Studio中使用的微秒或毫秒范围内做出反应。所有重要的js库的TypeScript标头也都存在。太好了。
经验和风险。使用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标准,而所有主要浏览器都原生支持Dart的可能性很小。 >
http://blog.bolinfest.com/2013/01/generating-google-closure-javascript.html

迈克尔·波林(Google)(ex)fb很久了前端英雄,也参与了Google封闭(获取有关Closure的书)。 />https://github.com/google/traceur-compiler

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

Facebook Flow,Google AtScript

提供与TypeScript类似的功能。

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

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

有关fb流的infoq文章

评论


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

–丹
13年4月2日在9:27



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

–citykid
13年4月5日在16:55

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

– Darshan Sawardekar
13年7月2日在15:16



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

– Nurettin
2014-12-18 14:23



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

–citykid
2014年12月24日12:18

#3 楼

引用Scott Hanselman:


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


摘自为什么TypeScript可以解决任何问题?

评论


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

–aikeru
2012年10月25日17:40



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

–雪佛兰
2012年12月6日17:47



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

–hippietrail
2013年1月9日在6:08

作为记录,这可以工作var x = {}; x ['foo'] = 5;这样做也太y:any = {}; y.foo = 5 ;,但是我发现您对此是正确的感到有些惊讶-{}的感知类型是{}而不是任何类型。可能是类型推断问题。我在这里发布了问题-我们将看到他们的回应。

– Mindplay.dk
13-10-21在0:27

#4 楼



第一:TypeScript

MS采用了一种很好的方法,因为您可以轻松地跳入和跳出TS。和JS。我们主要使用AngularJS进行开发,并且发现没有很多文档将Angular转换为TypeScript。将TypeScript整合到我们的Dev工作流程中是一个很好的补充。也许他们不记得activeX以及所有试图使应用程序在除可怕的IE 5或IE 6之外的其他任何版本上运行的噩梦。从那一天开始,MS花费了很多年的时间。

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

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

目前,尝试在除琐碎的应用程序之外的任何其他应用程序中使用Dart的概念令人恐惧。

ES6最重要的是不远处。 ES6带来了Dart试图修复的ES5中存在的许多功能。 ES6上市后,价值主张将是什么?至少在这个时候,一旦ES6发布,您在TypeScript中唯一要做的更改就是选择一个不同的编译器作为目标。 MS生产了一些不错的产品,并且在解决OSS社区过去的错误方面取得了长足的进步。除了MS的TypeScript之外,我仍然很少使用其他任何内容。