起初历史背景
- 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。语法指的是我们编写文本以形成程序的方式。例如,这段代码有一个语法错误,因为它缺少一个 )
Types(类型)
然而,TypeScript是一个类型化的超集,这意味着它添加了关于如何使用不同类型的值的规则。之前关于 obj.heigth 的错误不是语法错误:它是以不正确的方式使用某种值(类型)的错误。作为另一个例子,这是可以在浏览器中运行的JavaScript代码,它将 log 一个值

