Answers:
如果您喜欢JS语义或您有大量的JS代码库投入使用,但是在大规模维护方面遇到了问题,TypeScript看起来不错。它的成功路径要平滑得多,因为它(主要是?)与JS向后兼容。
Dart冒险下注。我认为,它在很多方面都与JS距离较远,这在日常Dart程序员中最有效,但它使入门的门槛更高。但是,以更高的进入门槛作为回报,您可以获得:
另外,他在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不是那样。
问题是“这些语言的目的是否相同吗?”,而真正的问题是:“我们如何从自己所在的位置使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。这就是为什么:
该飞镖编辑器是达特程序的唯一方法。尽管存在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非常容易,只需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个小时才能发表自己的见解。试试吧。
过了一段时间,事后看来,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的书)。
谷歌今天采用ECMA Script 6的方式是其Traceur项目:https: //github.com/google/traceur-compiler
与Typescript相比,到目前为止,工具支持可能远远落后。从好的方面来说,采用过冷的未来js语言改进(例如迭代器或理解)会更快。
提供与TypeScript类似的功能。
微软的乔纳森·特纳(Jonathan Turner)说:“人们可能想知道这些不同的JavaScript类型检查解决方案是什么以及如何处理。一个好消息是,微软,Facebook和Google正在合作进行这些工作:
TypeScript团队与Flow和AtScript团队合作,以帮助确保JavaScript类型社区已经创建的资源可以在这些工具中使用。这些项目可以互相学习很多,我们期待着共同努力,并为JavaScript社区创建最好的工具。从长远来看,我们还将努力将这些工具的最佳功能集成到ECMAScript(JavaScript背后的标准)中。”
this
上下文,因为您仍然必须将在方法内部声明的回调函数与方法的this
上下文绑定以便访问类属性。那怎么“固定”任何东西?
引用Scott Hanselman的话:
人们已经将TypeScript与Dart进行了比较。那是将苹果与化油器进行比较。TypeScript基于JavaScript构建,因此没有JS互操作问题。Dart是从头开始编写的本地虚拟机。Dart与JavaScript互操作...但是不是JS。例如,它甚至不使用JavaScript数字类型。
var x = {}; x.foo = 5; //Doesn't work in typescript
和var e = window.event ? window.event : e; //Doesn't work in typescript
上面的例子将失败打字稿编译器。我想念什么吗?我不能只是随意插入我的JavaScript并使用类型。我必须学习一些新的语法并使用类型来构造所有内容。
var x = {}; x['foo'] = 5;
,这种方法确实有效var y:any = {}; y.foo = 5;
,但确实如此,但是我发现您对此是正确的感到有些惊讶-感知到的{}
is {}
而不是any
。可能是类型推断问题。我在这里发布了问题-我们将看到他们的回应。
最近我不得不根据自己的发现来进行讨论。
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以外的任何东西。