随着PC端快速向移动端迁移,移动(体验)优先的概念也越来越响。由于ReactJS目前移动端仅仅支持iOS,因此移动端Web开发框架只能选择: AngularJS/Angula2 + Ionic框架 + Cordova。想要学习好Angula2以及阅读其代码, 就必须了解和学习TypeScript,也因此需要学习好ES6以及Web Component。近期将开始学习TypeScript语言。
下面先看看TypeScript语言的发展:
鉴于JavaScript这种脚本语言很难应用于大规模Web应用的开发,微软公司在2012年推出了新的开源编程语言——TypeScript。作为Object Pascal和C#之父Anders Hejisberg的又一作品,TypeScript是JavaScript的超集,但完全兼容JavaScript。相比于JavaScript,TypeScript增加了可选类型、类和模块,扩展了原有的语法,使得代码组织和复用变得更加有序,方便进行大型Web应用的开发。
微软是在2012.11月份将TypeScript语言开源,0.8.1版本是第二个开源的版本[1]。
2014年4月,TypeScript 1.0版本正式发布[2]。之后,微软公司不断更新该语言,陆续推出了1.3、1.4版本。
2015年7月20日TypeScript1.5版本正式发布[3]。
2015年9月2日TypeScript1.6 Beta版本发布[6]。
[4]虽然对TypeScript 1.5版本的新特性进行了翻译,但其中一些关键字词上含义偏差较远,而且没有给出举例的代码,下面内容主要是参考[3][4]重新整理的。
首先,在ES6(ECMAScript 6,即ECMAScript 2015)的支持方面。TypeScript 1.5版本增加了对ES6中Modules、Destructuring、Spread、for..of、Symbols、Computed Properties、Let/Const、和Tagged String Templates等新特性的支持。这些新特性使得TypeScript向成为ES6的超集并为ES6的所有主要特性提供类型检查的目标迈进了一大步。
其次,在模块(Module)方面,TypeScript 1.5也进行了很大改动。TypeScript 1.5支持ES6的新模块语法——ES6模块可以用import导入模块并用export导出每一个公共API,甚至可以只导入公共API所需要使用的那部分。
import * as Math from "my/math"; import { add, subtract } from "my/math";
而且,开发人员还可以使用default export声明表示模块的核心内容,从而可以对API做更精确控制。
// math.ts export function add(x, y) { return x + y } export function subtract(x, y) { return x – y } export default function multiply(x, y) { return x * y } // myFile.ts import {add, subtract} from "math"; import times from "math"; var result = times(add(2, 3), subtract(5, 3));
在math.ts文件的最后一行用了'export default',这一行可控制这是一个'default' export,当只是用名称而不是用花括号({})来导入具体的exports时就导出这个缺省export,就像myFiles.ts文件的第二行。
此外,TypeScript 1.5对模块进行了简化,并换用更加简洁的名称——内部模块改称为“namespace”,外部模块才为“module”。
由于JavaScript既用于浏览器也用于服务器端,因此TypeScript已经支持将模块编译为AMD或 CommonJS。为了支持更多的JavaScript实践,TypeScript 1.5新增加了两个新的模块输出格式:SystemJS和UMD,其中SystemJS可以使ES6 modules更接近于原生语义(native semantics)而不需要ES6兼容的浏览器引擎,UMD输出单个模块,从而可与AMD和 CommonJS一起配合。
再次,在创建更轻量、可移植的项目方面。鉴于VS Code、Sublime、Atom和其他编辑器已经开始支持tsconfig.json文件,TypeScript 1.5的编译器也开始支持该类型文件,使得用户可以指定工程中的文件和编译选项。该方法创建的项目既可在命令行也可在编辑器中进行开发,更加轻量化。
最后,TypeScript 1.5还添加了ES7中建议的Decorator特性的支持,该特性目前由Angular、Ember和Aurelia团队在合作开发 。由于目前ES7仍然处于开发阶段,其Decorator特性也被视为实验性质。但是,用户目前已经可以进行体验,感受其强大之处。
下面是在Angular 2中使用decorators:
import {Component, View, NgFor, bootstrap} from "angular2/angular2"; import {loadFile} from "audioFile"; import {displayAudioFile} from "displayAudio"; @Component({selector: 'file-list'}) @View({ template: ` <select id="fileSelect" size="5"> <option *ng-for="#item of items; #i = index" [selected]="selected === item"(click)="updateSelection()">{{ item }} </option> </select>`, directives: [NgFor] }) class MyDisplay { items: string[]; constructor() { this.items = ["item1", "item2"]; } updateSelection() { … } }
Decorators可以将元数据(metadata)关联到类以及类成员上,并更新那些被装饰的功能。上面代码中,Angular 2使用Decorators来定义类中的HTML selector和template。
React中采用JSX语法编写DOM和native component,但JSX语法与TypeScript中的映射(cast)语法冲突。
为了支持React/JSX, TypeScript从1.6版本开始引入一个新的.tsx文件后缀,使能TypeScript文件中的JSX,同时采用新的'as'运算符作为映射的缺省方式[6]。
同时,对象检查规则更加严格,例如
var x: { foo: number }; x = { foo: 1, baz: 2 }; // 错误,多了一个property 'baz', 但在1.6版本之前无法检测出 var y: { foo: number, bar?: number }; y = { foo: 1, baz: 2 }; // 错误, 多了一个或拼写错误property 'baz', 但在1.6版本之前无法检测出
另外,提升模块解析,使解析更为自然。还增加支持ES6中类表达式(class expressions),开始支持generators。
4. 参考资料
[1] Announcing TypeScript 0.8.1, 15 Nov 2012, http://blogs.msdn.com/b/typescript/archive/2012/11/15/announcing-typescript-0-8-1.aspx
[2] Announcing TypeScript 1.0, 2 Apr 2014, http://blogs.msdn.com/b/typescript/archive/2014/04/02/announcing-typescript-1-0.aspx
[3] Announcing TypeScript 1.5, 20 Jul 2015, http://blogs.msdn.com/b/typescript/archive/2015/07/20/announcing-typescript-1-5.aspx
[4] TypeScript 1.5正式发布:深度支持ECMAScript, 2015年7月26日, http://www.infoq.com/cn/news/2015/07/TypeScript-ECMAScript
[5] TypeScript的崛起, 2015年4月13日, http://www.infoq.com/cn/news/2015/04/TypeScript-rise
英文The Rise of TypeScript? March 30, 2015, http://developer.telerik.com/featured/the-rise-of-typescript/
[6] Announcing TypeScript 1.6 Beta: React/JSX, better error checking, and more, 2 Sep 2015, http://blogs.msdn.com/b/typescript/archive/2015/09/02/announcing-typescript-1-6-beta-react-jsx-better-error-checking-and-more.aspx