其他分享
首页 > 其他分享> > Why TypeScript ?

Why TypeScript ?

作者:互联网

TypeScript 是一种非常受欢迎的 JavaScript 语言扩展。它在现有的 JavaScript 语法之上加入了一层类型层,而这一层即使被删除,也丝毫不会影响运行时的原有表现。许多人认为 TypeScript "只是一个编译器",但更好的理解其实是把 TypeScript 看作两个独立的系统:编译器(即处理语法的部分)和语言工具(即处理与编辑器集成的部分)。通过独立看待这两个系统,就可以得到能够解释我们之前所做决策的两个重要视角。

在 npm[3] 上,TypeScript 的下载量每年都在翻倍。如今(博客发布于 2021 年 4 月 14 日),它的每周下载量约为 2000 万次。而在去年 4 月,这一数字约为 1000 万次。它仍保持着高速增长的趋势,没有任何放缓的迹象。

1. 我们是怎么令它变得如此受欢迎的?

从 2.0 版本开始,TypeScript 每两月定期发布一个 release。但是现在我们放缓了发布的节奏,改为每三个月发布一次。其中我们会花一个月编写新 features 并发布 beta 版本,剩下两个月对 beta 版进行测试和 bug 修复,这使得后续的发布更加稳定。

1.1 大事件时间线

在我看来,下面这些都是让 TypeScript 不断突破流行极限的大事件:

我的看法:TypeScript 之所以流行,是因为它不断通过工具(DT / -- isolatedModules / JSDoc)降低入门门槛,与其它工具和组织合作(Babel / TC39),并通过渐进式的方式展示工具和类型安全在 JavaScript 中的价值。如今,那些写 JSDoc 的人实际上就是 TypeScript 用户,就像使用 --strict 的人一样。

1.2 TypeScript 的竞争者有哪些?

TypeScript 的目标是为人们提供编写大型 JavaScript 项目并对后期维护有信心的工具。JavaScript 本身没有的语法支持表示每个标识符的类型,除非运行 JavaScript 并在运行时进行检测。为了解决这个问题,TypeScript 添加了额外的语法。

所以,如果说我们的目标是作为工具提供支持,那么在这个领域有少数几个竞争者是 TypeScript 无法与之竞争的:

那么,为什么大多数开源 Flow 代码库最终都迁移到了 TypeScript 呢?在我看来,很大程度上是由两个团队不同的侧重点决定。Flow 是为了维护 Facebook 的代码库而建立的,而 TypeScript 是作为一种独立的语言建立的。这里有两个证据可以证明:

  1. Facebook 的代码库是一个不能被分割的巨大的 monorepo,而 Flow 团队为了使类型运行在这样的大代码库[8]下做了大量令人难以置信的工作[9]。另一方面,TypeScript 可以说是“为构建小代码库服务(use projects to make sets of smaller codebases)”,因为这符合人们在开源社区中编写 JavaScript 模块的方式。我认为这么说很合理,TypeScript 不能像 Flow 一样运行在 Facebook 的代码库上,它要么需要大量重写 Facebook 的代码来构建项目,要么需要对 TypeScript 进行大量修改,这可能会影响到 TypeScript 整体开发者的体验。

  2. 对比 DefinitelyTyped 和 Flow 对类型的做法,TypeScript 团队会轮值一名编译器工程师为 DefinitelyTyped 支持我们的构建工具,并帮助管理社区。而 Flow,它几乎完全由社区维护。DT 现在规模更大了,因为它们一直致力于非 Facebook 代码的开发,这将很难获得 Flow 团队的资金支持。

微软给 TypeScript 在内部创造的独立环境让它可以自由专注于工具开发和整个生态系统的维护,而不是只专注于解决某个特别困难的问题。这让 TypeScript 团队能够与许多人合作,不断发布社区想要的功能。随着时间的推移,我猜想因为外部的需求增长放缓,Flow 团队越来越难为社区工作分配时间。这就形成了一个恶性循环。这使得 Flow 今天不再是 TypeScript 的直接“竞争者”,而是一个关于如何从不同的角度,使用不同的约束去解决类似的问题的有趣视角。

2. 未来

2.1 对 TypeScript 的未来怎么看?

目前阻碍人们使用 TypeScript 的最大障碍是它需要构建工具。我认为类型语法不太可能被加入 JavaScript 中,但是在 JavaScript 中“用注释的方式定义类型”的可能性非常大。

这个想法是为 TypeScript 这样的类型系统创建一套语法,但是不定义 JS 运行时会发生什么。

const a: string = "1234"

// 将会变成这样
const a/*: string */ = "1234"

// 传入 JS 引擎

在这个例子中,JS 引擎会知道 : string 是一个类型注释,在 = 处结尾。这实际的工作方式是复杂的,需要时间来弄清楚。然而,让 TypeScript 能在 JavaScript 中“原生地”运行将降低它被使用的障碍。它会像 Babel 添加 TypeScript 支持时一样对 TypeScript 施加一些约束。但我觉得这是值得的。

Deno 是一个消除所有 TS 障碍的关键例子,它通过运行一个 Rust 编写的工具,能够非常快速地将 TS 编译到 JS,模拟了当前 JavaScript 引擎对原生 TypeScript 的支持。

2.2 如今的竞争者

2.3 TypeScript 怎么看它在生态中的位置?

TypeScript 希望在类型系统和编辑器工具领域进行创新。我们拥有在主流编程语言中表达能力最强的类型系统之一。

TypeScript 最初被创建时,对 JavaScript 进行修改的流程和现在非常不同,所以 TypeScript 中有一些特性实际上是 TC39 的领域,但仍然需要向后兼容。这些特性可能在 JavaScript 中存在很多年,并且经过了多次迭代,这意味着 TypeScript 必须维护一个特定语言特性的两种版本。

所以我们的目标是成为 TC39 JavaScript 语言委员会的优秀成员,就编辑器支持的语言特性进行反馈,支持 TypeScript 用户想要看到的特性。通过这种协作方式,TC39 控制了 JavaScript,TypeScript 也支持他们。

2.4 TypeScript 怎么看它的受众?

TypeScript 的受众主要有:

虽然项目使用 babel / swc / sucrase / esbuild 等工具构建时,tsc 是可选的,但是上面的几种受众仍然可以在每次或至少每两次 TS 版本发布中获得新特性(译者注:babel、esbuild 等会更新支持 TS 新特性。可能是 TS 团队直接去这些项目里做,也可能会在没有 tsc 的情况下为这些项目提供特性,比如通过 vscode。在 TS roadmap[10] 中可以了解更多发布计划)。

2.5 TypeScript 是如何跟踪 JS 生态的?

团队从以下几个方式听取反馈:

参考资料

[1]

orta: https://twitter.com/orta

[2]

原文: https://orta.io/notes/js/why-typescript

[3]

npm: https://www.npmjs.com/

[4]

DT 的故事: https://blog.johnnyreilly.com/2019/10/08/definitely-typed-movie/

[5]

isolated modules: https://www.typescriptlang.org/tsconfig#isolatedModules

[6]

soundness: http://logan.tw/posts/2014/11/12/soundness-and-completeness-of-the-type-system/

[7]

TS 不是类型完备的: https://www.typescriptlang.org/docs/handbook/type-compatibility.html#a-note-on-soundness

[8]

大代码库: https://flow.org/en/docs/lang/types-first/

[9]

大量令人难以置信的工作: https://medium.com/flow-type/improvements-to-flow-in-2019-c8378e7aa007

[10]

TS roadmap: https://github.com/microsoft/TypeScript/issues/42673

标签:TypeScript,语言,JavaScript,Flow,TS,工具,Why
来源: https://blog.csdn.net/m0_55389447/article/details/118650561