TypeScript: 应用级别的JavaScript开发

[原文发表地址]  TypeScript: JavaScript Development at Application Scale

[原文发表时间] 2012-10-01 8:55

除了支持行业标准的编程语言,如C++, Python 以及JavaScript之外, 微软一直走在创造卓越的编程语言的前列——Visual Basic, C#, 和F#就是最近的例子。我们创造编程语言来解决问题,并促使大批的人去写软件。

今天,我们介绍一种新的编程语言,它解决了一个非常具体的问题—— JavaScript规模开发。这种语言就是TypeScript. 你可以学到很多有关TypeScript 项目,下载一个早期的预览版,阅读以及讨论这种语言的特性, 浏览在线园地,并且细细品读编译源文件(在CodePlex上的TypeScript项目站点,有GIT库)。

在过去的五年里,JavaScript的速度每九个月就翻倍(由WebKit SunSpider JavaScript 为基准衡量。)有了HTML5,标准网络平台提供丰富的用户体验,因此更加引人注目。同时,JavaScript的触及面正在持续扩大,正在超越浏览器来包括本机设备应用程序(如Windows 8的Windows商店应用),云中的应用程序(如:运行在Windows Azure上的Node.js),还有更多。随着这些发展,我们开始看到JavaScript编写的应用程序有着前所未有的规模,尽管事实上建立大规模的JavaScript应用程序是很难的。而TypeScript让它更容易。

这里有一个由Anders Hejlsberg讲述的一个很好的概况和TypeScript的介绍

应用程序级别的JavaScript

JavaScript原本是为网页客户端而设计的脚本语言,很多年来它都只局限于文档对象处理(DOM)的事件处理程序。结果,JavaScript失去了很多必要功能来高效编写以及维护大型应用程序,即那些在组件与开发者之间创建不同的合同关系的功能。为了克服这个问题,开发者(包括一些微软团队)已经开始使用一些工具如用于静态编码的Script#,用于代码检测的jslint 以及其它lint工具,以及closure compiler来定义组件之间的明确的合同关系。他们还采用了如模块模式的最佳实践来实现封装。

来说一说TypeScript。TypeScript是一个集类型检查、静态分析、接口声明以及最佳做法到单一语言及编译器中的JavaScript超级集合。由于构建于JavaScript之上,TypeScript可以只添加一些必要的平易近人的语法就可以让您接近指定的运行时,从而支持大型应用程序和大型团队。重要的是,TypeScript可以在JavaScript开发中启用好的开发工具体验,如我们已经为.NET和C++所建立的那些,而且能在项目上不断创新,像 “Roslyn”。无论你是编写运行在Windows,IE浏览器或者其它浏览器及操作系统上的客户端JavaScript,还是编写运行在Windows Azure或其它服务器和云端的服务器端JavaScript,这些都是真实的。

TypeScript使用JavaScript开始和结束

您已经开发的JavaScript代码可以很容易带入到TypeScript的世界——所有的JavaScript代码就是TypeScript代码。举个例子,譬如下面这个简单的“Hello, world”示例。左边方框中的是将原先JavaScript代码当作TypeScript处理,右边的方框包含了TypeScript编译器对这段代码的输出,您会注意到这个输出本质上是同样的JavaScript代码, 仅有一些小的空白差异以及分号的插入:

但是我原先的代码有一个bug,由于JavaScript的动态本质,我在开发时没有发现这个bug。运行这段代码,点击按钮就会产生这个意外结果:

有了TypeScript,我可以添加一行简单的内联类型批注到Greeter 函数参数中,启用编译器来提供一个更好的模具体验,在编译时完成编译报错和提供更多错误信息。当查看输出的JavaScript代码时,你将看到类型批注完全没有被编译(或者说是“被清除了”):

既然参数有一个类型批注,我们可以得到高质量的IntelliSense。另外列出string的成员,这个IntelliSense同样可以列出成员的类型(当成员是个方法时,这还会包括它的参数):

由于TypeScript和JavaScript非常接近,TypeScript和JavaScript之间的交互也是非常简单。TypeScript不仅允许用户继续使用他们现有的JavaScript库,它还允许用户通过一个声明文件获取早期的错误检测和更好的模具。声明文件是一个非常小的类型信息,它描述了在现有的JavaScript中所期望的接口。最重要的是,通过使用声明文件,开发人员可以不必修改现有的JavaScript库代码,就可以享受TypeScript带来的好处。它还可以为DOMde以及就jQueryWinRT这样的库开启IntelliSense和编译时检查:

除了这个便利以外,TypeScript的类型系统也很轻便。它不会强制开发人员在JavaScript移植时立即为所有的工程添加类型批注。相反,类型是可选的,随着开发人员想逐步改进工具以及错误检测,他们可以添加类型批注。很多情况下,TypeScript编译器会推测类型,自动查找类型,从而节约开发人员的时间。

类的声明和模块性

TypeScript并不仅仅只是类型批注。为了更好的封装,TypeScript包括了类型的声明语法,它与新兴的ECMASript 6标准中的类的建议保持一致。从我们之前“hello, world”的例子可以看出,在类声明中包装一个Greeter函数会为原型继承产生地道的JavaScript:

模块,面向对象的编程技术作为构建大型系统的有效方式已经有几十年了,但是JavaScript要使用这些技术不太容易。有了TypeScript,JavaScript程序员可以很容易地进入接口来描述需求,继承来共享方法,并且模块化来使相关代码组织为命名空间。

TypeScript中有了对模块化的支持,还与ECMAScript 6中新兴的建议保持一致,TypeScript可以支持针对流行的模块加载相应规格,包括任何ECMAScript 3 兼容环境中的CommonJSAMD。 AMD不仅允许用户在运行时里加载这些代码模块,还允许使用彼此间的依赖项来自动加载相关的模块组。TypeScript编译器支持从TypeScript模块生成AMD,使网站拥有扩展到大型应用程序的潜力。

更好的模具

微软长期以来一直主张语言和工具应共同协作来创造最佳的开发体验。有了TypeScript,曾经局限于静态输入语言的丰富模具体验如今都可以在JavaScript中使用了。除了TypeScript语言和编译器,我们将公布一个Visual Studio 2012的TypeScript 插件,它可以扩展Visual Studio的功能到一个完整的开发人员体验,包括代码导航,重构,静态报错信息,以及IntelliSense:

这个产业和广大社区可以为TypeScript创造很多工具。微软开源技术公司已经为TypeScript支持创建了示例,你可以在其它耳熟能详的代码编辑器里找到它。

开源与相互协作

所有的JavaScript都是TypeScript,这就是说你可以在现有的JavaScript程序中拷贝,然后粘贴到一个TypeScript文件。你也可以创建一个TypeScript声明文件来批注已有库的类型,无须改动库本身便可启用很棒的工具体验(在TypeScript文件中可以声明多种流行的JavaScript库,如jQuery,MongoDB,以及DOM)。在未来几周内,我们计划与创建这些库的开发者社区形成合作伙伴关系,来确保这些声明类型的TypeScript文件可以提供最好的开发体验支持。

因为TypeScript生成标准规格的JavaScript,TypeScript与我们的承诺是一致的:确保开发者可以使用相同的markup和脚本,从而形成一个更加相互协作的网络:TypeScript编译器的输出可以运行在任何浏览器上,在任何宿主上,在任何操作系统上。更进一步讲,它已经插入到你现有的JavaScript工具链中。你可以使用你现有的minifiers,lint Checkers,build systems,以及命令行工具来与TypeScript编译器的输出相互动。

TypeScript是开源的。TypeScript语言遵循开源网络基金会的最终规范协议(OWFa 1.0),我们邀请社会各界讨论它的语言规范。微软编译器的开发也放在了CodePlex(有git库)上,位于Apache 2.0许可下。在那里你可以看到我们的路线图,在接下来的几个星期或几个月里,你将看到TypeScript团队在这个开源环境CodePlex上持续不懈地开发。

TypeScript建立在有着良好的工作环境的TC39委员会之上,而该委员会决定着ECMAScript标准的发展方向,也就是JavaScript的正规标准。我们将继续与委员会合作推动JavaScript语言及运行时功能的发展。委员会也期望我们可以走的更远,并且提交TypeScript到标准体系中,对此我们均持开放态度。

期待您的反馈

就在几星期前,我们启动了Visual Studio 2012,并且为了给Visual Studio开发者持续地提供高价值,我们积极地致力在“VS 更新”上。同时,我们正在计划工具的未来主要版本。随着像“Roslyn”这样的项目,TypeScript是使得编程语言和工具应用更加高效的一种尝试,就像“Roslyn”,TypeScript也是一种早期预览。捡起它,拿着它把玩一下,我们期待您的反馈。您可以通过讨论该语言的功能说明或者填写一个bug与我们一起促进它的发展。

我个人感到超级兴奋得是TypeScript将会对世界软件开发,特别是在一个拥有如此多的Web编程模型力量的世界里,有着怎样的影响力。这是微软在标准化网络开发中追求卓越工具的旅途中重要的一步。

敬礼!