TypeScript 是一种来自微软的语言,它建立在 JavaScript 之上。
这篇文章是对 JavaScript 是什么、TypeScript 如何扩展 JavaScript 以及它解决哪些问题的非技术概述。

什么是 JavaScript?

由于 TypeScript 扩展了 JavaScript,因此它是一个良好的起点。JavaScript 通常用于创建网站。在构建网站时,您会使用三种语言:HTML、CSS 和 JavaScript (JS)。从广义上讲:HTML 定义了将在页面上显示的内容,CSS 定义了页面的视觉样式,而 JS 定义了页面的交互行为。

我们将拥有这些技能集描述为“前端”开发人员。您使用三种语言在 Safari、Firefox、Edge 或 Chrome 等 Web 浏览器中创建页面。鉴于 Web 在商业和信息共享中的普及程度,对精通这三种语言的人才需求量巨大。

与“前端”开发人员的角色相关的是“后端”开发人员的技能集,它们是创建与 Web 浏览器(通过传递 HTML/CSS/JS)或其他服务(通过更直接地发送数据)进行通信的计算机服务。您不需要使用 HTML、CSS 或 JS 来编写这种类型的代码,但它通常是您工作的最终产品,因为它很可能在 Web 浏览器中呈现。

编程语言的作用是什么?

编程语言是人类和计算机之间进行交流的一种方式。人们阅读代码的次数远远超过他们编写代码的次数——因此开发人员创建了擅长用少量代码解决特定问题的编程语言。以下是用 JavaScript 的示例

var name = "Danger"
console.log("Hello, " + name)

第一行创建一个变量(实际上是一个可以存储其他东西的盒子),然后第二行将文本输出到控制台(例如 DOS 或终端)"Hello, Danger"

JavaScript 被设计为一种脚本语言,这意味着代码从文件顶部开始,然后逐行向下运行该代码。为了提供一些对比,以下是 Java 中的相同行为,Java 是用不同的语言约束构建的

class Main {
  public static void main(String[] args) {
    String name = "Danger";
    System.out.println("Hello, " + name);
  }
}

这两个代码示例做的事情相同,但是 Java 版本包含了许多不一定是告诉计算机确切要做什么的词语,例如 class Main {public static void main(String[] args) { 以及两个额外的 }。它还在某些行的末尾添加了分号。这两种编程语言都没有错,但是 Java 旨在构建与 JavaScript 不同的东西,这些额外的代码片段在构建 Java 应用程序的约束下是有意义的。

不过,为了达到关键点,我想比较一下其中的一行代码。

// JavaScript
var name = "Danger"

// Java
String name = "Danger";

这两行代码都声明了一个名为 name 的变量,该变量包含值 "Danger"

在 JavaScript 中,您使用缩写 var 来声明变量。而在 Java 中,您需要说明变量包含的是哪种数据。在本例中,变量包含一个 String。(字符串是编程术语,指字符的集合。它们 "看起来像这样"。这个 5 分钟的视频 是一个很好的入门,如果您想了解更多信息。)

这两个变量都包含一个字符串,但区别在于在 Java 中,变量只能包含字符串,因为我们在创建变量时就是这么说的。在 JS 中,变量可以更改为任何东西,比如数字或日期列表。

为了说明这一点

// Before in JS
var name = "Danger"
// Also OK
var name = 1
var name = false
var name = ["2018-02-03", "2019-01-12"]

// Before in Java
String name = "Danger";
// Not OK, the code wouldn't be accepted by Java
String name = 1;
String name = false
String name = new String[]{"2018-02-03", "2019-01-12"};

这些权衡在 1995 年这些语言被构建的背景下是有意义的。JavaScript 最初被设计为一种小型编程语言,用于处理网站上的简单交互。另一方面,Java 是专门为构建可以在任何计算机上运行的复杂应用程序而构建的。他们预计会被用来构建不同规模的代码库,因此该语言要求程序员编写不同类型的代码。

Java 要求程序员对变量的值更加明确,因为他们期望人们构建的程序更加复杂。而 JavaScript 选择通过省略有关细节的信息来提高可读性,并期望代码库的大小要小得多。

什么是 TypeScript?

TypeScript 是一种编程语言——它包含了所有 JavaScript,以及更多。使用上面的示例,让我们比较一下 JavaScript 和 TypeScript 中的“Hello, Danger”脚本。

// JavaScript
var name = "Danger"
console.log("Hello, " + name)

// TypeScript
var name = "Danger"
console.log("Hello, " + name)

// Yep, you're not missing something, there's no difference

由于 TypeScript 的目标只是扩展 JavaScript,因此我们看到的现有 JavaScript 代码可以作为 TypeScript 使用。TypeScript 添加到 JavaScript 的扩展旨在帮助您更明确地说明代码中使用的数据类型,有点像 Java。

这是同一个示例,但使用 TypeScript 更明确地说明变量是什么

var name: string = "Danger"
console.log("Hello, " + name)

这个额外的 : string 允许读者确信 name 只能是一个字符串。以这种方式对变量进行注释也让 TypeScript 有机会验证它们是否匹配。这非常有用,因为跟踪变量中值的类型变化,当只有一两个时似乎很容易,但一旦达到数百个,就很难跟踪了。编写类型可以帮助程序员对自己的代码更有信心,因为类型可以捕获错误。

简单来说,我们称这些注释为“类型”。因此得名 TypeScript。TypeScript 的一个口号是“可扩展的 JavaScript”,这意味着这些额外的类型注释可以让你在更大的项目上工作。这是因为你可以提前验证代码的正确性。这意味着你无需理解每个更改如何影响程序的其余部分。

在 90 年代,也许直到 5-10 年前,在 JavaScript 应用程序中没有类型的权衡是可以接受的,因为正在构建的程序的大小和复杂性仅限于网站的前端。然而,如今 JavaScript 几乎被用于任何地方,用来构建几乎所有在计算机上运行的东西。大量的移动和桌面应用程序在幕后使用 JavaScript 和 Web 技术。

这些都比构建和理解要复杂得多,添加类型大大降低了对这些程序进行改进的复杂性。

TypeScript 可以解决哪些问题?

通常,确保代码中没有错误的需求可以通过编写自动化测试来处理,然后通过手动验证代码是否按预期工作,最后让其他人验证它是否正确。

并非所有公司都像微软一样大,但是许多在大型代码库中编写 JavaScript 的问题都是一样的。许多 JavaScript 应用程序由数十万个文件组成。对单个文件的更改可能会影响任意数量其他文件的行为,就像向池塘里扔一块鹅卵石,导致涟漪扩散到岸边一样。

验证项目中每个部分之间的连接可能会很快变得耗时,使用像 TypeScript 这样的类型检查语言可以自动处理这些问题,并在开发过程中提供即时反馈。

这些功能使 TypeScript 能够帮助开发人员对他们的代码更有信心,并在验证他们没有意外破坏项目方面节省大量时间。