《Effective TypeScript 》-- 条款1: 理解 TS 和 JS 的关系

487 阅读2分钟

条款一:理解 TS 和 JS 的关系

TypeScript 是 JavaScript 的超集;(Typescript is superset of Javascript)

这句话想比大家一定不会陌生,之前是写在 TypeScript 官网上的,那到底如何来理解他们两个之间的关系呢:

在语法上,只要你的 JS 没有任何语法错误,那么它就是一个 TS 程序,所以我们可以得出结论:所有的 JS 程序都是 TS 程序,但是反之不成立,大部分 TS 程序并不是合法的 JS 程序。

看一下 TS 和 JS 在的关系韦恩图:

流程图 (2).jpg

TypeScrip 是带有类型语法的 JavaScript。(TypeScript is JavaScript with syntax for types.)

这句话,是现在 TS 官网的 slogon ,你会发现,它从原来的超集的笼统的定义,变得更加具象了,它更加明确的指出 TS 是一种构建在 JS 之上的强类型编程语言;

这里有两个关键词,一个是构建在 JS 之上,一个是强类型;

  • 构建在JS之上:

TS 既不在解释器中运行(像Python 和 Ruby 那样),也不会编译成低级语言(像 JAVA 和 C 那样),相反,他会编译成另一种高级语言即 JS ,并且项目最终运行的是这个 JS ,而非 TS 代码。所以如上面的韦恩图所示,所有的 JS 程序都是 TS 程序;-

强类型:

  1. 错误更早暴露;
  2. 代码更智能,编码更准确;
  3. 重构更牢靠;
  4. 减少不必要的类型判断;

TS 添加了一个类型系统,该类型系统可以对 JS 的运行时行为进行建模,并尝试发现将在运行时引发的异常的代码。但是该类型系统不具有可靠性(保证静态类型的准确性的类型系统被称为是可靠的),并且 TS 不想也不能拥有可靠性,因为他是构建与 JS 之上的,而 JS 是动态语言;

TS 的类型系统的目标是在不运行代码的前提下检测在运行时会引发异常的代码,也可称为“静态”类型检测,但是 TS 不是静态语言,只是它提供了在运行前识别某些类型问题;

所以,有一些 JS 和 TS 的代码能够通过类型检查器,而有一些则会被捕获错误,所以单纯说 “TS 是 JS 的超集” 是有一些笼统,可以重新叙述为:

所有的 JS 程序都是 TS 程序;但是其中只有部分的 JS 和 TS 程序能够通过类型检查器;

流程图 (3).jpg

总结

  • 单纯说 TS 是 JS 的超集不够具体,官网变更成 TS 是 带有类型语法的 JS;
  • TS 添加了一个类型系统,或者叫做静态类型类型检查器,可以在运行前识别某些类型问题;