起初历史背景
- JavaScript(也称为ECMAScript)最初是作为一种简单的浏览器脚本语言出现的。在它被发明的时候,它被期望用于嵌入在网页中的简短代码片段,编写超过几十行代码会有些不寻常。由于这个原因,早期的web浏览器执行这些代码的速度非常慢。然而,随着时间的推移,JS变得越来越流行,web开发人员开始使用它来创建交互式体验
- Web浏览器开发人员通过优化他们的执行引擎(动态编译)和扩展它的功能(添加api)来应对JS使用量的增加,这反过来又使Web开发人员更多地使用它。在现代网站上,您的浏览器经常运行跨越数十万行代码的应用程序。这是“web”漫长而渐进的成长过程,从简单的静态页面网络开始,演变成各种丰富应用程序的平台
- 不仅如此,JS已经变得非常流行,可以在浏览器环境之外使用,例如使用node.js实现JS服务器。JS的“随处运行”特性使其成为跨平台开发的一个有吸引力的选择。现在有许多开发人员只使用JavaScript来编写整个技术栈
- 总而言之,我们有一种为快速使用而设计的语言,然后发展成为编写数百万行应用程序的成熟工具。每种语言都有自己的怪癖、古怪和惊喜,JavaScript的卑微开端使它拥有了许多这样的怪癖。以下是一些例子
// JavaScript的相等操作符(==)强制它的操作数,导致意外的行为(ub)
if ("" == 0) {
// It is! But why??
}
if (1 < x < 3) {
// 对x的 “any” 值为True
}
// JavaScript还允许访问不存在的属性
const obj = { width: 10, height: 15 };
// Why is this NaN? Spelling is hard!
const area = obj.width * obj.heigth; // 注意,heigth 这是拼写错误的情况
当这类错误发生时,大多数编程语言都会抛出错误,有些会在编译期间抛出错误,在任何代码运行之前。在编写小程序时,这种怪癖很烦人,但可以控制;在编写包含数百或数千行代码的应用程序时,这些不断出现的意外是一个严重的问题
TypeScript:静态类型检查器
我们之前说过,有些语言根本不允许这些有bug的程序运行。在不运行代码的情况下检测代码中的错误被称为静态检查。根据所操作的值的类型来确定哪些是错误,哪些不是错误,这被称为静态类型检查。TypeScript在执行前检查程序的错误,并根据值的类型进行检查,使其成为静态类型检查器。例如,上面的最后一个示例由于obj的类型而出现错误。下面是TypeScript发现的错误

TypeScript 是带有 编译时类型检查器 的 JavaScript 运行时
JavaScript 的类型化超集
TypeScript 和 JavaScript 有什么关系呢
Syntax(语法)
TypeScript是JavaScript的超集语言:因此JS语法是合法的TS。语法指的是我们编写文本以形成程序的方式。例如,这段代码有一个语法错误,因为它缺少一个 )

TypeScript不认为任何JavaScript代码是错误的,因为它的语法。这意味着你可以把任何有效的JavaScript代码放到TypeScript文件中,而不用担心它到底是怎么写的
Types(类型)
然而,TypeScript是一个类型化的超集,这意味着它添加了关于如何使用不同类型的值的规则。之前关于 obj.heigth 的错误不是语法错误:它是以不正确的方式使用某种值(类型)的错误。作为另一个例子,这是可以在浏览器中运行的JavaScript代码,它将 log 一个值

这个语法合法的程序 log 一个 Infinity。然而,TypeScript认为数组对数字进行除法是一个无意义的操作,并且会发出一个错误

您可能真的打算用一个数字除以一个数组,也许只是想看看会发生什么,但大多数情况下,这是一个编程错误。TypeScript的类型检查器被设计成允许正确的程序通过,同时仍然捕获尽可能多的常见错误(稍后,我们将学习如何设置TypeScript检查代码的严格程度)。如果你把一些代码从JavaScript文件移到TypeScript文件,你可能会看到类型错误,这取决于代码的编写方式。这些可能是代码的合法问题,或者TypeScript过于保守。在本指南中,我们将演示如何添加各种TypeScript语法来消除此类错误
Runtime Behavior(运行时行为)
TypeScript也是一种编程语言,它保留了JavaScript的运行时行为。例如,在JavaScript中除以零会产生Infinity而不是抛出运行时异常。作为一个原则,TypeScript永远不会改变JavaScript代码的运行时行为。这意味着,如果你把代码从JavaScript移到TypeScript,即使TypeScript认为代码有类型错误,它也会以同样的方式运行。与JavaScript保持相同的运行时行为是TypeScript的一个基本承诺,因为这意味着你可以很容易地在两种语言之间转换,而不必担心可能导致程序停止工作的细微差异
Erased Types(擦除类型)
粗略地说,一旦TypeScript的编译器完成了对代码的检查,它就会擦除这些类型,以产生最终的“编译”代码。这意味着编译完代码后,生成的纯JS代码没有类型信息。这也意味着TypeScript永远不会根据它推断的类型改变程序的行为。底线是,虽然在编译期间可能会看到类型错误,但类型系统本身与程序运行时的工作方式无关。最后,TypeScript不提供任何额外的运行时库。你的程序将使用与JavaScript程序相同的标准库(或外部库),因此不需要学习额外的typescript特定框架