Typescript 从开始至今,其流行趋势是越来越明显的
根据
Github
的 Octoverse
报告,2021年,Typescritp的使用率已经飙升至第四位,其增长趋势远超其他语言几乎所有的流行开源库如
MUI
,Antd
,lodash
,React
,Vue
等,都支持TS类型,可以说是开源库的标配。而对于前端开发者来说,使用 Typescript 的原因有以下三点
- 能更早的发现代码中的错误
- 能够帮助提高生产力
- 支持
JavaScript
语言中的最新特性并且使用与JavaScript
语言相同的语法和语义
能更早的发现代码中的错误
为什么说能更早的发现代码中的错误,这个问题其实很简单,不是
Typescript
太强,而是 JavaScript
实在太弱了在编程界,有两个坐标来分类语言,
动态vs静态
,强类型vs弱类型
,动态和静态的差别大家都懂,强类型和弱类型要如何区分呢。强弱类型的区分标准是,
不同类型的变量是否支持隐式转换
,拿 Python
和 JavaScript
来举例>>> def func(a): ... return a + '' ... >>> func(1) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in func TypeError: unsupported operand type(s) for +: 'int' and 'str'
当
Python
中尝试将 string
和 number
进行操作时,会报错,认为两个不相同的类型,不支持继续 + 操作> function func(a){ ... return a + ''; ... } undefined > func(1) '1'
而放在
JavaScript
下面,并不会报错,而是会将数字类型做隐式转换,最后返回一个字符串类型 纵使
JavaScript
的隐式转换有着严格的规范,能让我们在面试的时候被问的七荤八素,但依然阻止不了再项目中成为 bug
制造的大帮凶同时,类型的缺少让我们在开发的时候很难通过一段代码就确定其是否是正确的。因为输入几乎不可能保证来源和类型。在小的项目里面我们可以感受到
JavaScript
写起来是如此的快速和自由,这也是JavaScript
常年位居语言榜第一的原因之一,但是当项目逐渐复杂和起来,我们就会发现整个系统已经逐渐脱离了我们的控制。因此,
Typescript
对于类型的引入,帮我们在开发阶段就确定了某段变量,某个函数的输入与输出类型,大大保证了应用的确定性。至少它在运行类似下面这种代码时时会提醒你,你在做违背祖宗的决定
function vMe50(name: string){ return `v ${name} 50`; } vMe50(['甲', '乙', '丙']);
提高生产力
荀子有云: 君子生非异也,善假于物也
程序员效率要想快,同样得善于借助工具。而基于 Typescript,我们除了拥有类型检查这个工具之外,我们还拥有了以下几个非常提高效率的工具
自动补全
当我们在开发纯JS应用时,我们往往得不到有效的代码提示,不过由于我们现在用的基本都是
VSCode
,而 VSCode
本身就是完全用 Typescript
开发的,所以在哪怕再 JS类型的文件中,他也能够显示出类型来,但是这种类型是根据字面量推导出来的,对于没有类型定义的函数,就只能推断为any了。所以在 VSCode
中,即使我们在写 JS 代码,我们依然在享受 Typscript
给我们带来的便利 🙂而在
Typescript
的文件中,这种自动补全的能力则可以完美的发挥出来,任何类型对应的函数及其参数都能快速找到,而不需要自己死记硬背了,可以说,这是一个对前端开发者最友好的时代。重构工具
- 重命名
我们可以在
VSCode
中选中一个变量,按下 F2
,这时会弹出输入框,输入新的名称,即可统一重命名- 提取到常量 / 内部函数 / 全局函数
这也是非常有用的工具,选中要提取的表达式,按下
command
+ .
即可展示对应的工具- 将多个参数转换成一个析构对象
- 提取类型
- 移到新文件
可以说为我们重构代码提供了非常多的便利。
这里顺便安利一下《重构,改善既有代码的设计》一书,我大学的老师说过,我们想要有成长,首先从重构自己的代码开始。
支持 JavaScript 的最新特性
我们知道
JavaScript
是门很特殊的语言,它的运行环境是依赖于浏览器的,而不同的浏览器对于语言的实现程度又不太一样,同一浏览器的不同版本对于js的实现又不相同,这就导致了我们使用最新的语法写出来的代码是可能在浏览器中完全使用不了上面是各个浏览器对于 ECMAScript 2015(ES6) 的实现,看上去还是比较乐观的。
但是到了ES7,就已经完全查不到了,所以其实作为JS程序员,我们也不太关心浏览器对于最新的
JavaScript
的规范的支持,而是依赖于工具帮我们将代码转换为 ES5 的版本。Babel
帮我们做到,同样 TypeScript
也可以帮我们做到,只不过 TypeScript
增加了对于类型,以及 enum
的支持。Babel
还提供了 TypeScript
没有的丰富插件,当然在 webpack
的组织下,两者的使用其实并不冲突,都可以成为构建链中的一部分工作。不得不说,前端的工具,实在是太多了
以上就是我们使用 Typescript 的 三大原因,利用好这些,我们能从开始就规避掉很多大项目中会遇到的问题,让我们的代码更加可靠。
缺点
说有点不说缺点,就像是王婆卖瓜,自卖自夸,是片面的,缺乏辩证的。
TypeScript 最为明显的一个特点就是带来了学习成本,本来只需要学
Javascript
的知识,但是到了现在,居然还要学一个所谓 Javascript
的超集。实在是令人头大。除此之外,并非学会了知识就会使用,
Typescript
虽然入门简单,但是要想较为熟练的使用并不简单,需要能使用不同的类型组合,应对不同的情况。第三点就是对于库的开发者,难度和时间成本大大增加了,虽然这对于库的使用者来说是非常幸福的事情,他们不用通过文档或者猜测去调用函数,而直接可以通过
Typescript
来观察函数的输入输出。如果没有充分了解
Typescript
,只是为了类型而类型。那么结果就是 Typescript
→ AnyScript
。END