你有没有遇到这样一个场景,你访问了变量的属性,但是这个变量是一个undefined
,如果你没有在这个地方都提前做好错误兜底,那么此时页面就会报错导致出现白屏。
如果你的应用已经上线了,因为你的这个错误导致用户不能使用,那么等待你的就是老板和产品一顿狠批。这时,你是否会觉得JavaScript
没有你想得那么完美。
JavaScript
是伟大的,也是自由的,正因为它的自由,你会用起来特别爽。但,这种自由是有代价的,最主要的是它缺少类型这个能力,导致你无法直接查看一个变量在经历一通操作后变成了什么类型,导致你在开发较复杂应用时的效率没那么高。同时,由于缺少类型保障,可能导致你的代码中出现调用 undefined
值和访问 undefined
值的属性这种问题。很多同学觉得这个问题好像也不大啊,仔细一点就可以了,这只能说明你太年轻了,你如果开发过一个大型复杂应用就知道这个问题是多么的严重了。
TypeScript
是什么?
TypeScript
听名字它就是一门全新的语言?但是我怎么听说它还有编译能力?好像还需要配置?写 JavaScript
的时候我可从来没听过配置 JavaScript
这回事,所以它到底是个啥?
首先,TypeScript
就是一门编程语言------和 JavaScript 是并列的!
但是在编程语言领域,有很多"一门编程语言基于另一门编程语言"的例子,比如基于 C 语言的 Python 与 Lua,基于 Java 的 Kotlin 与 Scala 等等,这些语言的诞生大部分是为了获得底层的高性能与使用"更好"的语法与功能。
而 TypeScript
也是如此,它是基于 JavaScript
开发的,在 JavaScript
的基础之上添加了类型,而这也是我们前面提到的,JavaScript
最为人诟病的问题之一。
所以,有人说TypeScript
是JavaScript
的超集。
TypeScript
: 提供类型保障
现在我们知道, JavaScript
最大的不足之处是无法提供类型保障。比如没有类型,想知道这个变量是什么值只能靠你一个个 console.log
查看。直到某一天,由于没有类型提示和缺少足够细致的检查,你的代码中有一处尝试对一个 undefined
值进行调用,这个严重的错误导致出现了线上白屏。
这时,TypeScript
出现了,它能够解决这个问题,而且还是原汁原味的 JavaScript
语法和 API,只需要新学习类型这个东西,就能够弥补 JavaScript
的最大遗憾之一,所以,前端同学学起来轻松不少。
TypeScript
: 编译器
浏览器只能执行JavaScript
由于前端环境的特殊性,浏览器是只能执行 JS 文件的,TS 一方面相比 JS 诞生要晚得多,另一方面也有它是由微软,而非公共技术组织维护的原因。因此,如果 TypeScript
仅仅只做了添加类型这件事情,那么其实是完全没意义的,辛辛苦苦写完,发现浏览器完全不认,那就很头疼了。
因此,TypeScript
还需要能够被转换为 JavaScript
才能为开发者所接受,类似的,上面的这些一门基于另一门的编程语言,也大多都拥有这种编译为自己基于的语言的能力。而在从 TypeScript
编译到 JavaScript
的过程中,TypeScript
团队提供了 tsc
这个编译工具(它是在安装 TypeScript 的同时就会一起被安装的),它能将 TS 中的类型擦除,而擦除了类型之后,剩下的就是原汁原味的 JS 代码了。
高阶语法的使用
随着 TypeScript
的演进,开发团队意识到了一个问题,JS 的迭代效率实在是太慢了!一个新的语法就算大家都一致认为非常有必要,都眼巴巴盼着使用,也需要经过数次公开会议,然后等着浏览器支持...。
如果你想提前用,就需要引入 Babel
,包括找到插件,配置插件,然后给原来开箱即用的代码加一道编译工序...。
这个时候 TypeScript
团队一想,反正我编译到 JS 的时候都要做一次编译工作了,那还不如说我提前让你能使用这些 JS 还没完全支持的语法,然后编译的时候跟 Babel 一样,我顺便把这些语法编译到低版本浏览器也能运行的语法不就行了?
而绝大部分的编译工具,都是需要配置的,包括降级到哪个 ES 版本,使用哪种模块(CommonJs、ES Module、UMD、IIFE ...)等等。所以 TypeScript
也引入了自己的配置文件 tsconfig.json
,用于进行编译等等能力的配置。
正是因为这些背景因素,使得我们今天学习的 TypeScript
颇有些"四不像"的味道,说你是编程语言,你还有那么多配置,说你是编译工具,你怎么还能直接当一个全新的大有可为的编程语言来写。
总结
通过上面的了解,你已经知道TypeScript
是什么了,它就是:TypeScript = JavaScript + 类型 + Babel
。
在学习TypeScript
之前能理解到这么一点对后面的学习是非常重要的,它能帮助你时刻理解TypeScript
是干什么用的。