第6章 静态类型检查:Flow.js和TypeScript

如果你一直使用原生的JavaScript语言编写程序,没有接触过其他编程语言,或许会对“代码静态类型检查”的概念感到陌生。在介绍什么是“代码静态检查”之前,需要先介绍静态类型语言和动态类型语言的定义。静态类型语言是指在编译时就能确定各个变量的类型,所以在代码运行之前,就可以对其进行类型检查,自然在程序运行之前也就可以发现其中一些潜在的问题。而动态类型语言是指在编译时并不知道变量的确切类型,变量的类型可以通过赋值改变,所以只能等程序运行时才能获取变量的准确类型,如果程序中存在类型错误,代码可能会直接报错,严重时还会导致程序退出。

JavaScript就是一门动态类型语言,一般在开发初期,需要更快地开发出应用原型,动态类型可以提供更好的编程体验,使开发者可以更专注于业务逻辑的程序设计,而不必纠结于如何为每一个声明的变量指定正确的类型。既然如此,那为什么还要引入静态类型呢?动态类型的灵活性并不是没有成本的,灵活性必然会带来编码的多样性和随意性,这无疑会增加调试和维护的难度。试想,你编写的程序在运行时报出一个错误,你根据错误中的堆栈信息找到相关代码之后,发现它只是一个低级错误,尽管你很快就可以将它修复好,但问题还远远没有结束,比如修改后的代码就一定是正确的吗?其他代码会受到影响吗?还有没有类似的问题也会引起报错?这些你都无法确定,只有再次运行程序才可能确定。这会使调试的过程变得枯燥且艰难,你不得不花费大量的时间一次次重新运行代码,然后依靠报错信息来找出自己或其他人在程序中留下的错误。当你花了好几个小时调试代码,最终却发现是别人的代码导致的错误时,那种感觉真的是一言难尽。

为了解决上面的问题,我们需要在源代码的基础上引入一层类型系统,静态类型的引入为语言增加了静态类型检查的能力,从而使得开发者不必运行代码就可以检测出明显的语法错误,另外,它还可以用来共享接口定义或类定义等一些公共的定义信息。这些看似多余的做法都是为了能够让JavaScript在现代前端开发中承担更多的责任,而不只是被当作一种“玩具”语言。

本章将介绍静态类型检查的相关知识,以及两种流行的静态类型检查方案Flow.js和TypeScript的使用方法。