什么是 JavaScript?
由于 TypeScript 扩展了 JavaScript,这使得它成为了一个很好的切入点。JavaScript 通常用于创建网站。在构建网站时,你会用到三种语言:HTML、CSS 和 JavaScript (JS)。简而言之:HTML 定义了页面上显示的内容,CSS 定义了页面的视觉样式,而 JS 定义了页面的交互行为。
我们通常将掌握这些技能的人称为“前端”开发人员。你使用这三种语言在 Safari、Firefox、Edge 或 Chrome 等网页浏览器中创建页面。考虑到网络在商业和信息共享方面的流行程度,市场对擅长使用这三种语言的人才有着巨大的需求。
与“前端”开发角色相关的是“后端”开发人员的技能集,他们负责创建计算机服务,这些服务可以与网页浏览器通信(通过向其传递 HTML/CSS/JS),也可以与其他服务通信(通过更直接地发送数据)。编写这类代码时,你不需要使用 HTML、CSS 或 JS,但它们通常是你工作的最终产品,因为它们很可能最终呈现于网页浏览器中。
编程语言的作用是什么?
编程语言是人类与计算机交流的一种方式。人们阅读代码的次数远多于编写代码的次数——因此,开发人员创建编程语言,旨在以少量代码解决特定问题。以下是一个使用 JavaScript 的示例
var name = "Danger"
console.log("Hello, " + name)第一行代码创建了一个变量(实际上就是一个可以存储其他东西的盒子),第二行代码将文本输出到控制台(例如 DOS 或终端)"Hello, Danger"。
JavaScript 被设计为一种脚本语言,这意味着代码从文件顶部开始,逐行向下运行。为了进行对比,这里是 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 有机会验证它们是否匹配。这非常有用,因为当只有一两个变量时,跟踪诸如值的类型这类变化似乎很容易,但一旦数量达到数百个,跟踪起来就非常困难。编写类型有助于程序员对他们的代码更有信心,因为类型可以捕获错误。
简单来说,我们将这些标注称为“类型”(Types)。这也是 TypeScript 名称的由来。TypeScript 的口号之一是“可扩展的 JavaScript”,这旨在说明这些额外的类型标注使你能够处理更大的项目。这是因为你可以预先验证代码的正确性。这意味着你不需要完全了解每一个改动如何影响程序的其余部分。
在 90 年代,甚至直到 5 到 10 年前,在 JavaScript 应用中没有类型带来的权衡是可以接受的,因为当时构建的程序规模和复杂性仅限于网站的前端。但今天,JavaScript 几乎无处不在,被用于构建几乎任何可以在计算机上运行的东西。大量的移动应用和桌面应用在底层都使用了 JavaScript 和 Web 技术。
构建和理解这些应用要复杂得多,添加类型可以显著降低改进这些程序的复杂性。
TypeScript 能解决什么问题?
通常,确保代码中没有 Bug 的需求可以通过编写自动化测试、手动验证代码是否符合预期,以及最后由另一个人验证它是否正确来处理。
并不是很多公司都有微软那样的规模,但在大型代码库中编写 JavaScript 时,很多问题都是一样的。许多 JavaScript 应用由成百上千个文件组成。对单个文件的一处改动可能会影响其他任意数量文件的行为,就像往池塘里扔进一块鹅卵石,引起涟漪扩散到岸边一样。
验证项目各部分之间的连接可能会很快变得非常耗时,而使用像 TypeScript 这样具有类型检查的语言可以自动处理这些问题,并在开发过程中提供即时反馈。
这些特性使得 TypeScript 能够帮助开发人员对他们的代码更有信心,并节省大量时间来验证他们没有意外破坏项目。