15

使用 TypeScript 的 10 个 理由

 4 years ago
source link: http://developer.51cto.com/art/202002/611489.htm
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

最近,我读了一篇名为 《放弃 TypeScript 的 7 个非常好的理由》 ,这篇文章的阅读量不低。里面有些观点确实有趣,不过在这里我要向你介绍使用 TypeScript 的 10 个理由。

TypeScript 降低代码出错的风险

开发人员写 BUG 是很自然的事情。几乎有一半的时间,我们都是在查找程序出错的原因。在 JavaScript 中,原因可能只是简单如类型错误。例如,将数值赋值给字符串变量,这个操作在 JavaScript 中没问题,但在 TypeScript 中会编译失败。JavaScript 开发人员已经被这种问题困扰很久了,甚至引入严格模式(Strict mode)来减少这种错误。

const getLength = (someString: string) => someString != undefined ? someString.length : 0; 
 
let testTS = "what"; 
testTS = 3000; // Type '"what"' is not assignable to type 'string' 
 
getLength(testTS); 

使用 TypeScript,上面的代码是无法编译的,不会出现在最终的代码库中。而使用 JavaScript 则不然。即便 TypeScript 无法避免运行时类型错误,但依然可以有效地降低这种风险。

快速失败原则

在代码可正常运行之前,TypeScript 引入了一个新的强制性步骤:将代码转换为 JavaScript。在编写新代码时,这个步骤每天也可能会失败很多次。而非静态类型的语言会将失败和错误检测延迟到运行时。可空类型对于任何现代语言都非常重要,它有助于扩展代码。

Adrian Colyer 在 2017 年写了一篇非常有趣的文章:量化 JavaScript 中可检测的错误。在文章的结尾,你可以找到一个有趣的实验结果,Eric 调查了 JavaScript 工程中公开的 400 个 BUG,通过使用 TypeScript 或者 Flow,可以有效捕获其中的 59 个,而不会出现在生产环境中。注意,在本文中,我们考虑的只是减少错误代码。

让代码有更丰富的信息/文档

如今,在前端开发中,编写可重用代码和可重用组件已经跟玩似的。重新造轮子很容易出错,而且成本太高。因此,最好使用现有的库或代码。TypeScript 在代码中添加了很多信息,并强制执行此用法。输出的 TypeScript 代码包含更多相关的信息,如类型签名等。而 JavaScript 代码的说明信息就很少了,阅读起来比较费劲。你要么需要以 JSDoc 的形式提供信息,要么以某种外部文档的形式提供信息。当大量重用代码时,则会降低开发效率。

当然,阅读和编写文档仍然很重要,但是类型提示让代码更具可读性。对于尚未完全了解您的代码库的人来说尤其如此。智能感知功能更适用于 Typescript,因为能获取到类型签名信息。

6rumi2j.jpg!web

在短期内,使用 TypeScript 有时确实意味着需要打更多的字。另外,由于 TypeScript 将转换为 JavaScript 并与 JavaScript 代码库混合使用,因此确实有时需要和它进行斗争,并在某些地方将其关闭。但是从长远来看,TypeScript 可以扩展,而 JavaScript 却很难扩展。现在使用 TypeScript 能在将来帮到您的开发人员。

TypeScript 比 JavaScript 具有更多功能

TypeScript 的功能比 JavaScript 更多。显然,静态类型检查是最主要的一个,但还有其它的。大多数 TypeScript 的特性(之前 JavaScript 未实现的)现在在 JavaScript 都已经实现了。但是 TypeScript 仍具有优势,因为它的演进速度比 JavaScript 快。如接口、名称空间、泛型、抽象类、数据修改器、可选、函数重载、装饰器、utils 类型和 readonly 关键字等。本文并不打算涵盖所有这些功能,只简单举个只读的 TypeScript util

interface Article { 
  title: String; 
  content: String; 
} 
 
/** 
 * Pure function, that translates the article and returns it 
 */ 
const translate = (article: Readonly<Article>) => { 
  const article2 = {...article}; 
  article2.title = translateText(article.title); 
  // Cannot assign to 'content' because it is a read-only property 
  artilce.content = translateText(article.content); // Ooops, developer meant articles.content = ... 
   
  return article2 
} 

更好的重构和工具

重构 TypeScript 代码比使用非类型化语言要容易得多。我目睹了许多 JavaScript 开发人员使用全局搜索和替代来重命名变量,而最终导致单元测试失败的情况。使用 TypeScript,您可以在代码中获得其他语义。使用接口或类时,编译器知道对象将包含哪些字段。现在,重命名接口、类或枚举的字段比以往更加容易。只需使用 VSCode 或 IntelliJ 的重构功能,即可见证奇迹的出现。

Njmiaeq.gif

背景强大

一项广泛使用的技术有几乎无限的资源可以来学习它。TypeScript 就是这样,因为它拥有庞大的社区。

而如果您正在考虑使用 Angular,则别无选择,只能选择 TypeScript。 从 Angular 2 开始,Google 完全采用 TypeScript 作为其主要语言。如果你不使用 Angular,而是将 React 与 TypeScript 一起使用,则将极大地降低将来开发 Angular 项目的复杂性。

解决 JavaScript 中静态类型问题的替代方案

长期以来,JavaScript 的一个问题就是没有静态类型。在过去,这个问题困扰着开发者,但是项目还是要进行。而在 JavaScript 的发展过程中,也一直在尝试添加静态类型。

例如,React 为其组件发布了 PropTypes,以减少开发阶段的类型错误 -- 而 TypeScript 完全涵盖了这一功能。 Facebook 还有其自己的静态类型检查库(Flow),该库基本上与 TypeScript 的原理是一样的。2014 年,Google 也提出了一种基于 JavaScript 的脚本语言,该语言扩展了 TypeScript,称为 AtScript。

TypeScript 的其它优势

  • TypeScript 由 Microsoft 编写和维护。这是科技巨头花时间认真维护的一个项目,使该语言更具有安全感。
  • TypeScript 不仅在 MIT 许可下是完全开源的,而且该项目还提供了透明的路线图和提交特性请求的功能。
  • TypeScript 编译器完全使用 TypeScript 编写,因此一旦您对该语言有信心,您甚至可以为代码库做出贡献并扩展其功能!

结论

TypeScript 提高了代码的可读性,无疑能减少错误,或者至少可以更快地捕获这些错误 -- 即使在编写或运行任何单元测试之前。JavaScript 肯定是朝着正确的方向发展,但是静态类型语言的优势尚未完全实现。当可选的静态类型将来成为 JavaScript 的一部分时,使用 TypeScript 无疑是完美的知识储备。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK