
1.2 选择TypeScript的理由
微软推出TypeScript主要是为了实现两个目标。
● 为JavaScript提供可选的类型系统。
● 兼容当前及未来的JavaScript的特性。
下面将对这两个目标进行详尽的解析。
1.TypeScript的类型系统
读者可能会问,为什么要给JavaScript加上类型?
类型系统能够提高代码的质量和可维护性。大型团队(如Google、Microsoft、Facebook等)经过不断实践后得出一些结论,以下两点尤其值得注意。
● 类型有利于代码的重构,它有利于编译器在编译时而不是运行时捕获错误。
● 类型是出色的文档形式之一,函数签名是一个定理,而函数体是具体的实现。
然而,类型总是有一些不必要的复杂的存在方式,而TypeScript在这方面尽可能地降低了入门门槛。它是通过以下方式做到的。
1)JavaScript即TypeScript
TypeScript为JavaScript代码提供了编译时的类型安全。由TypeScript的名字就可以看出,这种做法并不奇怪。最棒的是这些类型是完全可选的。写在.js文件里的JavaScript代码,可以被重新命名为.ts文件,TypeScript仍然会返回与原始JavaScript文件相同的.js文件。被设计成JavaScript的“超集”,并且带有可选的类型系统,TypeScript是经过慎重考虑并有意这样做的。
2)类型可以是隐式的
TypeScript将尽可能多地去推断类型信息,以便在代码开发过程中以极小的成本为你提供类型安全。例如,在下面的代码里,TypeScript会知道foo的类型是number,并在第2行显示把字符串赋值给它是错误的。

这种类型推断是很有必要的。如果你做一些类似上面例子里的事情,那么,在接下来的代码里,你就不能很确定foo是number类型的还是string类型的。这类问题经常出现在大型、多文件的代码库中。稍后我们将会深入探讨类型推断的规则。
3)类型可以是显式的
正如之前所提到的,TypeScript会尽可能安全地推断类型。然而,你可以使用类型注解来做下面的事情。
● 帮助编译器,更重要的是为下一个必须阅读代码的开发人员记录内容。
● 强制编译器编译你认为它应该去编译的内容,这可以让编译器对代码所做的算法分析与你对代码的理解相匹配。
在后面的章节中,我们将讨论TypeScript支持的所有注解语法的细节。
4)类型是结构化的
在一些语言(尤其是带有名义上的类型系统的语言)里,静态类型会导致一些不必要的方式的存在,因为即使知道代码可以正常工作,语言的语义也会迫使你复制周围的一些东西。这就跟AutoMapper这样的东西对C#来说非常重要是一个道理。在TypeScript中,我们真的希望类型对JavaScript初学者来说是非常简单的,因此,TypeScript的类型是结构化的。这意味着鸭子类型是一流的语言结构。在下面的例子中,函数iTakePoint2D将会接受包含它所期望的事物(x和y)的所有内容。

5)类型错误不会阻止JavaScript的正常运行
为了方便把JavaScript代码迁移到TypeScript,即使存在编译错误,在默认情况下,TypeScript代码也会尽可能地被编译为JavaScript代码,例如下面的示例。

将会编译成下面这样。

因此,你可以将JavaScript代码逐步迁移至TypeScript,这与其他语言编译器的工作方式有很大不同,而这也正是TypeScript被青睐的另一个原因。
6)类型可以由环境来定义
TypeScript的主要目标之一是让人们能够安全、轻松地在TypeScript中使用现有的JavaScript库。它可以通过声明来做到这一点。TypeScript提供了一个浮动的标准来衡量你希望在声明中投入多少努力;投入的越多,你获得的类型安全和代码智能提示就越多。请注意,大多数流行的JavaScript库的声明定义已经由DefinitedTyped社区编写过了,因此,在大多数情况下,声明文件已经存在;或者,至少已经拥有了大量经过深思熟虑的可用的TypeScript声明模板。
可以把jQuery作为一个编写声明文件的简单示例。在默认情况下,TypeScript要求(正如良好的JavaScript代码所要求的一样)在使用变量(即在某处使用var)之前先进行声明。

一个快速的修复方法是,你可以告诉TypeScript,这里确实存在被叫作$的变量。

如果你愿意,可以基于此基础来定义结构,并提供更多信息以保护你免受错误的影响。

当你了解了更多关于TypeScript的信息(如interface、any等)后,我们将会详细讨论如何为现有的JavaScript创建TypeScript的类型声明。
2.支持未来的JavaScript所具有的功能
TypeScript为当前的JavaScript引擎(只支持ES5,ES5全称为ECMAScript 5.0)提供了许多计划在ES6中使用的功能。TypeScript团队正在积极添加这些功能,这些功能会随着时间的推移而越来越多,例如下面这个类。

又如箭头函数。
