TypeScript 介绍和使用
什么是TypeScript
Typed JavaScript at Any Scale.
添加了类型系统的 JavaScript,适用于任何规模的项目。
TypeScript
即 Type
+ JavaScript
。
简单说来 Js
有的 Ts
都有,所有 Js
代码都可以在 Ts
里面运行。
在项目推行TypeScript有什么好处
对于我们在团队中推行 TypeScript
,可能大家都有同样的疑问:
我们为什么要这么做?
或者说,我们这么做,有什么好处?
那么,可让我叉一会腰,我要告诉你,好处可海了去了~
因为推行 TypeScript
会在项目中取代 JavaScrip
,那么我主要围绕两者之间的区别来介绍。
从语言类型检查的时机来看
我们所编写的代码在执行层面,按照类型检查的时机来分类,可以分为动态类型和静态类型
动态类型
动态类型是指在运行时才会进行类型检查,这种语言的类型错误往往会导致运行时错误。
静态类型
静态类型是指编译阶段就能确定每个变量的类型,这种语言的类型错误往往会导致语法错误。
标准的 Js
代码是不会在编写的时候抛出异常并报错的,
所以这段代码在开发人员编写阶段,不会有任何提示和手段来告诉开发者,这段代码会引起整个网页的异常和中断,最终导致造成线上 Bug。
JavaScript
是一门解释型语言,没有编译阶段,所以它是动态类型,代码在运行时才会发生报错。
TypeScript
则不同,
它在运行前需要先编译为 JavaScript
,而在编译阶段就会进行类型检查,所以 TypeScript
是静态类型。
在编译阶段报错
同样的一段代码,如果是使用 Ts
来编写,
那么它在编译时会报错(数字没有 split 方法),无法通过编译,自然而然这段代码就无法通过检查提交到代码仓库并发布线上,最终避免造成线上 Bug
我们为什么要推行Ts
从大型项目来看
显而易见的,对于 <b>大型项目</b> 来说,使用 TypeScript
的是非常适合的。
Ts
相比 Js
来说,有一个非常重要的特性,即类型系统
。
类型系统可以为大型项目带来更高的可维护性以及更少的 bug。
我们都知道,JavaScript
是一门非常非常灵活的语言,
灵活到什么程度❓
举个栗子:
1、我们声明变量 a 并赋值,类型为数值
,值为 123
2、紧接着我们又将一个对象 object
赋值给 a,此时变量 a 的类型为 对象
3、最后我们执行了运算符 +
号操作,将对象与数值相加,Js
通过隐式类型转换
,将变量 a 的最终类型改变为 字符串
4、这一波花里胡哨的操作下来也并没有产生报错!!!
这一切都源于 Javascrip
灵活的特性:
无类型约束
他没有类型约束,一个变量可能初始化时是数值,过一会儿又被赋值为对象
隐式转换
由于隐式类型转换的存在,有的变量的类型很难再运行前就确定
基于原型
JavaScript
是基于原型的面向对象编程,原型上的属性或方法可以在运行时被修改
函数
JavaScript
中的函数同样也非常的灵活,可以复制给变量,也可以作为参数或者是返回值
老实说,JavaScript
的灵活性其实就是一把双刃剑,
初次接触编程工作,或者说是因为厌烦了强类型语言而突然转到这门语言的同学,会觉得非常的<b>爽!!</b>
一方面,如此灵活的特性使得 JavaScript
蓬勃发展,多年以来连续占据最普遍使用的言语排行榜榜首,生态也得到了爆发性完善。
另一方面,也使得它的 <b>代码质量参差不齐,维护成本高,运行时错误多</b>。
TypeScript
的类型系统,在很大程度上弥补了JavaScript
的缺点。类型系统可以为大型项目带来更高的 <b>可维护性以及更少的 Bug</b>
TypeScript
在完整保留 JavaScript
运行时行为的基础上,通过引入静态类型系统来提高代码的可维护性,减少可能出现的 bug。
从中小型项目来看
对于在团队中推行 TypeScript
最大的障碍其实是使用它需要写大量额外的代码,降低了开发效率。
事实上,由于 TypeScrip
拥有 类型推论
的特性,大部分的类型其实都不需要你去手动的声明。
类型推论
如果没有明确的指定类型,那么
TypeScript
会依照类型推论(Type Inference)的规则推断出一个类型。
以下代码虽然没有指定类型,但是会在编译的时候报错:
事实上,它等价于:
TypeScript
会在没有明确的指定类型的时候推测出一个类型,这就是类型推论。
如果定义的时候没有赋值,不管之后有没有赋值,都会被推断成 any
类型而完全不被类型检查:
TypeScript 在中小型项目中的优势
编辑器(IDE)赋能
IDE
为我们提供了<b>代码补全、接口提示、跳转到定义、代码重构</b>等功能这在非常大的程度上提高了开发效率。
足够完善且可以自定义的编译选项
如果你认为
TypeScript
的类型检查过于严格,那么可以通过修改编译选项来降低类型检查的标准。
对于初学者,我同样建议你从 AnyScript
角度入手
尽管这样做会失去 TypeScript
的类型保护优势,但是这样做确实可以降低入门门槛,让你以最快的速度上手,并且体验其独有魅力。
如果要使用 any
,你可以这样做:
声明变量不提供类型也不提供默认值
定义函数时,参数不给类型
TypeScrip 和 JavaScript 共存
如果你有一个使用 JavaScript
开发的旧项目,比如我们正在开发的 His 项目就是完全用它来开发的。
与此同时,你也希望和我一样尝试 TypeScript
的特性,
你并不需要需要着急把整个项目都迁移到 TypeScript
, 你可以使用 TypeScript
编写新文件,即使新文件使用.ts
、.tsx
结尾,老文件、使用JavaScript
的文件,保持使用 .js
、 .jsx
结尾。
你可以再后续的日常迭代中逐步的迁移旧文件
TypeScript 的发展已经深入到前端社区的方方面面了,任何规模的项目都或多或少得到了 TypeScript 的支持。
对于你,可能至今为止,你都还没有学习过 TypeScript
但是实际上,你已经在不知不觉中使用到了TypeScript
...
VSCode
编辑器中编写JavaScript
时,代码补全和接口提示等功能就是通过TypeScript Language Service
实现的。
一些第三方库原生支持了 TypeScript
, 在使用的时候就能获得代码补全了,比如我们常用的 Element
TypeScript 与标准同步发展
TypeScript
的坚持与 ECMAScript
标准同步发展。
ECMAScript
是JavaScript
核心语法的标准,自 2015 年起,每年都会发布一个新版本,包含一些新的语法。
新的语法从提案到变成正式的标准,一共会经历一下几个步骤:
Stage 0:展示阶段
仅仅是提供了讨论、想法,尚未正式提案
Stage 1:征求意见阶段
提供抽象的
API
描述,讨论可行性,关键算法等
Stage 2:草案阶段
使用正式的规范语言精确描述其语法和语义
Stage 3:候选人阶段
语法的设计工作已经完成,需要浏览器、Node.js 等环境支持,搜集用户的反馈
Stage 4:定案阶段
已经准备好讲其添加到正式的
ECMAScript
标准中
一个语法进入到 Stage 3 阶段后,TypeScript
就会实现它
在团队中推行 TypeScript
,
1、 让我们可以尽早的使用到最新的语法,帮助它进入到下一个阶段
2、 处于 Stage 3 阶段的语法已经比较稳定了,基本不会有语法的变更,这使得我们能够放心的使用它
总结
软件研发是一份在任何时候需要持续性学习的工作,
在阿里,马老师最常说的一句话就说 —— “拥抱变化”。
面对爆炸性发展的大前端环境,
我们需要既需要保持圣徒的心态,对一切新技术的诞生,对仿如朝圣一般。
与此同时,
亦需要怀着逢敌必亮剑的亮剑精神,对一切新生的事物,敢于发起挑战,如同勇者拔出宝剑,挥剑斩向TypeScript
这条恶龙。
何况,TypeScript
已经不新了~
评论