当前位置: 首页 > 科技观察

为什么TypeScript的流行是必然的?

时间:2023-03-14 12:03:36 科技观察

TypeScript这些年越来越流行了。可以说是前端工程师的必备技能。所有主要框架都基于它。那么,TypeScript的出现和爆发是偶然的吗?事实上,它不是。像TypeScript这样的静态类型语言成为主流是必然的。你为什么这么说?我们先来思考一个问题:什么是类型?具体来说,类型是指number、boolean、string等基本类型和Object、Function等复合类型。它们是编程语言提供的不同内容的抽象:不同类型的变量占用不同的内存大小:布尔型变量只会分配1个字节的内存,而数字类型变量会分配8个字节的内存,为变量声明不同的类型意味着它们会占用不同的内存空间。不同类型的变量可以进行不同的运算:number类型可以进行加减乘除等运算,boolean则不能。复合类型中的不同类型的对象可以使用不同的方法,例如Date和RegExp。不同类型的变量代表该变量可以做的事情是不同的。我们知道什么是类型,自然可以认为类型和操作必须匹配,这就是为什么需要进行类型检查的原因。如果能保证对某个类型只能进行该类型允许的操作,这就叫做类型安全。比如你对boolean进行加减乘除,这是类型不安全的,如果你对Date对象调用exec方法,这是类型不安全的。反之,就是类型安全。因此,类型检查是为了保证类型安全。类型检查可以在运行时完成,也可以在运行前的编译时完成。这是两种不同的类型,前者称为动态类型检查,后者称为静态类型检查。两种类型的检查各有优缺点。动态类型检查在源代码中不保留类型信息,允许给变量赋任意值,做任意操作,因此编写代码非常灵活。但是这也埋下了类型不安全的隐患,比如字符串的乘法和除法,调用Date对象的exec方法等。这些错误只能在运行时检测到。其中最常见的错误应该是“nullisnotanobject”、“undefinedisnotafunction”等。写代码的时候没有发现类型不匹配,只有运行的时候才发现。会有很多这样的错误。错误。因此,动态类型代码虽然写起来简单,但是代码中容易隐藏一些类型不匹配的隐患。静态类型检查是在源代码中保存类型信息,声明变量指定类型,对变量的操作必须匹配类型,编译时会有专门的编译器检查。静态类型给写代码增加了一些难度,因为除了要考虑代码中要表达的逻辑外,还需要考虑类型逻辑:变量是什么类型,是否匹配,是否做类型转换等。但是,静态类型也消除了类型不安全的隐患,因为类型检查是在编译时完成的,所以不会出现字符串乘除、调用Date的exec方法等问题。因此,虽然静态类型在编写代码时考虑的问题更多,会更复杂,但它排除了代码中隐藏的类型不安全问题的可能性。知道了动态类型检查和静态类型检查的区别,我们自然可以得出结论,动态类型只适用于简单的场景,不适合大型项目,因为代码中可能存在太多的隐患。在前线报类型不匹配错误可能是个大问题。静态类型虽然会增加编写代码的成本,但是可以更好的保证代码的健壮性,降低bug率。因此,大型项目注定要用静态类型语言开发。JavaScript最初是为浏览器表单验证设计的,所以设计成动态类型,编写代码也比较简单。但是没想到JavaScript后来被用来开发各种项目,比如PC端和移动端的网页、ReactNative跨端App、小程序、Electron桌面、Node.js服务器、Node.js工具链等等。在开发各种大型项目时,JavaScript动态类型语言的缺点暴露无遗。bug率太高,健壮性难以保证。那么自然对静态类型有强烈的需求,于是TypeScript应运而生。TypeScript为JavaScript添加了静态类型系统,从动态类型语言变为静态类型语言。可以在编译时进行类型检查,提前发现一些类型安全问题。而且,由于在代码中加入了静态类型,可以配合编辑器实现更好的提示、重构等,这是一个额外的好处。那么,TypeScript的流行是偶然的吗?不,我认为这是不可避免的,因为大型项目注定要用静态类型语言开发。总之,类型决定了变量的内存大小以及可以对其执行的操作。保证对任何类型只进行一次操作称为类型安全,而保证类型安全的方法就是类型检查。类型检查可以在运行时进行,称为动态类型检查,也可以在编译时进行,称为静态类型检查。动态类型可能在代码中隐藏了太多的隐患,bug率比较高,所以大型项目注定要用静态类型语言开发。JavaScript本身是一种动态类型的语言。因为越来越多的用在开发各种大型项目中,所以对静态类型有需求。TypeScript满足了这一需求。并且有更好的提示,更容易重构的额外好处。因此,TypeScript的出现和目前的流行势在必行。