概述
本文会聊一聊提升代码质量的几个工具。 一方面是用于代码开发阶段的ts、eslint和prettier,这三个都是借助于ide对编辑中的源码给予提示,会分别利用ast对代码的类型、代码质量和格式三方面发挥作用。
另一方面是git 提交阶段的husky、lint-staged、@commitlint,分别负责创建git hook,对staged阶段的代码执行lint等操作和检查commit message,防止不规范代码进入版本管理。
以上工具都需要对应的配置文件。
typescript
ts是侵入性最强的一个工具,以至于通常被称为一种语言,主要给js添加了类型注释(另外还有一些区别于js的功能,比如enum),从而实现了js的静态类型分析,在代码运行之前就就可以捕获到潜在的错误。
ts的代码到最终的运行,需要经历一次到js的编译过程,这个过程可以由tsc实现,但实际的使用中会交给babel处理,tsc只负责类型。
vscode对ts提供了支持,在下载typescript lib的前提下会进行对应提示和报错。
书写规则
ts是js的超集,由js过渡到ts主要是学会对类型的运用,大致分为这么几部分
类型注释
就是给各种出现在代码中的标识符注释对应的类型。
其中类型又可以分为基本类型和表达式类型。
- 前者比如string或number等js中的primary type和any等ts中定义的部分。
- 后者是基本类型的组合,比如多个基本类型组合成array或者function。
无论是哪一种类型都是为了明确该标识符的具体用法,这个用法会在使用时进行提示,如果进行了规定之外的使用就会报错,也因此会对代码重构有很大帮助。
类型推断
如果对使用的标识符没进行类型注释时,这就需要ts自己推断可能的类型。
这里可以分为三种情况
- 最通用的类型,比如对一个用let定义的字面量类型,
let a = 'a',通常会推断为string,如果想被推断成字面量,可以用const声明。 - 上下文类型,比如通过函数类型,推断其中的参数类型
- 如果以上方法都无法推断,就推断为any,应该避免这种情况,因为失去了类型的意义。
类型断言
有时候类型推断出来的结果并不是我们想要的,就可以使用断言进行修正,比如上面的例子
let a= 'a' as const
Type Guards
这个是指如果一个标识符可能有多种类型时,比如union,通过type guard可以缩小类型的范围,即当进入一个类型判断有关的控制流时,这个控制流内的类型可能性就被缩小,下一个条件时就会把这种类型排除,比如
function padLeft(padding: number | string, input: string) {
if (typeof padding === "number") {
//这时是number类型
return new Array(padding + 1).join(" ") + input;
}
//这时是string类型
return padding + input;
}
类型兼容
当标识符a的类型不同于标识符b,但前者要赋值给后者时,就要后者的类型兼容于前者,比如参数少的函数会兼容含有另外参数的函数
配置文件
更多的自定义操作需要配置文件,通常是tsconfig.json,可以用来指示哪些文件会被ts处理和怎么处理。
下面大致谈谈几个常用的,详情看文档
files,include,exclude
- files指定具体需要处理的ts文件
- include用匹配符批量指定文件
- exclude用来排除include指定文件中不符合条件的文件
compilerOptions
这里用来指示ts具体怎么工作的,比如以下几类
- 类型检查相关,比如noImplicitAny会在类型推断为any时报错,用来提示显式声明类型
- 模块相关,比如项目采用什么模块系统,模块解析的方法,可以用来配置对应目录的alias
- 输出有关,声明文件和js文件等的输出情况
- 语言和环境,通过指定语言环境来判断具体的编译行为,比如jsx会据此来决定tsx文件怎么编译
eslint和prettier
eslint原本有两方面的能力,对语法错误和代码风格都可以处理,但第二个功能不如prettier,因此通常是 Prettier for formatting and linters for catching bugs!。
两者各自使用直接看文档就可以,ide的集成下载对应插件,并设置成保存时自动修复。
两者的一起使用这里稍微提一下,因为两者的功能有部分重叠,且没必要分别执行,因此有eslint-config-prettier添加到eslint 配置文件中可以去除两者冲突的部分,使用eslint-plugin-prettier可以在执行eslint 时自动执行prettier。
husky、lint-staged、@commitlint
这里我们要做的事是阻止不合格的代码进入远程代码库,和检查commit message,利用的是git hook,如果不利用第三方工具,我们可以直接修改对应文件的内容,其会在git操作的对应动作时自动执行。
- husky安装后会自动设置对应钩子,免去了手动设置的工作,另外两个包用来简化钩子调用期间的具体操作,这里注意新版本的用法有所不同
- lint-staged,用来对被git add后的文件执行lint等操作,一方面是只对要提交的代码进行检查,一方面是检查失败停止提交
- @commitlint 用来对commit message进行检查,如果不符合规范就阻止提交
最后
本文对几个工具做了概括性介绍,主要还是看文档,也可以看我其他总结,其中ts可以参考这篇,其他看这篇,注意因为版本原因产生的影响。
这个仓库用当前最新版本的工具进行了配置,可以参考。