基于JavaScript开发的项目,如网络邮箱,地图,文档编辑,协作工具等在每天从事的电脑工作中,正在变成越来越重要的组成部分。 我们设计TypeScript的目的就是满足JavaScript编程团队的构建需求,以及维护大规模的JavaScript程序。 TypeScript帮助编程团队在软件组件之间定义接口以及洞悉当前JavaScript库的行为。 TypeScript可以使团队在动态加载模块的场景下减少命名冲突。 TypeScript可选的类型系统使得JavaScript编程人员可以使用高度产品化的开发工具和实践:静态检查,基于标识符的导航,语句补全以及代码重构。

TypeScript是JavaScript的语法糖。TypeScript的语法是ECMAScript6(ES6)语法的超集。 任何的JavaScript程序同样是TypeScript的程序。 TypeScript编译器的行为仅仅基于局部文档做转化,而不会更改在TypeScript中定义变量的顺序。 这使得生成的JavaScript代码可以很好的匹配原始的TypeScript文件。 TypeScript不会更改变量的名字,使得可以直接基于生成的JavaScript代码做调试。 TypeScript提供source maps功能,使得可以在源码级进行调试。 TypeScript工具可以在保存源码之后同时生成JavaScript代码,保留常规开发中测试,编辑,刷新的循环过程。

TypeScript语法包含所有ECMAScript6(ES6)的特性,包括类和模块,提供将这些特性翻译到适配ECMAScript3或者5代码的能力。

类(class)使开发者能够基于标准,表达常用的面向对象模式,增加继承等特性的可读性以及提高协作开发的能力。 模块可以使得开发者使用组件来组织代码,并且规避命名冲突的风险。 TypeScript编译器提供了模块代码生成的选项用来支持模块内容的动态或者静态的加载。

TypeScript同样提供给开发者一个可选的类型注解系统。 这些类型注解与闭包系统中的JSDoc注释类似,但是在TypeScript中,直接整合进了语言语法。 这个整合使得代码的可读性更强并且减少了类型注解与关联变量同步的花销。

TypeScript类型系统使开发者可以描述JavaScript对象功能的限制,并且可以通过工具来实施这些限制。 精简工具需要的注解的数量变得非常有用,TypeScript类型系统广泛使用了类型推断。 如下例所示,TypeScript会推论变量i的类型为number。

  1. var i = 0;

TypeScript基于下例中的函数定义做推断,得到函数f的返回类型为string.

  1. function f() {
  2. return "hello";
  3. }

得益于推断行为,开发者可以使用TypeScript语言服务。 例如,一个代码编辑器可以结合TypeScript语言服务并通过该服务在下面的截屏中找到一个字符串对象的成员。

在这个例子中,在没有类型注解的情况下,开发者得益于类型推断。一些有帮助性的工具,仍然需要开发者提供类型注解。 如下所示,在TypeScript中,我们可以描述一个参数的类型。

  1. function f(s: string) {
  2. return s;
  3. }
  4. f({}); //Error
  5. f("hello"); //Ok

出现在’s’参数右边的类型注解使得TypeScript类型检查器获知程序期望参数’s’的类型为’string’。 在函数’f’的函数体中,工具可以假定’s’的类型为’string’,并且对操作过程进行类型检查,判断是否和假设的情况一致。 在第一个函数调用中,工具会抛出错误,因为’f’需要的参数为’string’,而不是一个对象,如同参数类型说明。 对于该函数’f’,TypeScript编译器会生成如下的JavaScript代码片段:

  1. function f(s) {
  2. return s;
  3. }

在JavaScript的输出中,所有的类型注解都被擦除了。通常来讲,TypeScript会在生成JavaScript代码之前擦除掉所有的类型信息。

1.1环境声明

环境声明将在TypeScript作用域内引入一个变量,但是对于发布的JavaScript程序没有丝毫影响。 程序员可以使用环境声明告诉TypeScript编译器,另外一些组件会提供一个变量。 例如,在默认情况下,使用了未声明的变量,TypeScript编译器会打印错误。 开发者可以使用环境声明的方式,增加一些浏览器提供的通用变量。 下面的例子声明了浏览器提供的’document’对象。 因为声明中没有指定类型,编译器推测为’any’类型。 ‘any’类型指的是,工具对于document对象的特征和行为不做任何假设。 下面的一些例子可以举例说明开发者使用类型来进一步描述对象的预期行为。