引入静态检查工具 ESLint
虽然 TypeScript 可以进行类型检查,但无法检查代码是否符合规范。代码是否符合规范可以由人工进行评审,也可以用工具进行自动检查,以减少人工投入。
ESLint 是一个自动化的静态代码检查工具,用于检测代码是否符合指定的规范。使用它可以让开发人员在编码的过程中就发现问题,而不是在执行的过程中才发现问题。
ESLint 的安装与应用
要在 TypeScript 中使用 ESLint,需先执行以下命令安装 ESLint 及用于 TypeScript 的 ESLint 扩展。
$ npm install eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin -D
上述命令将分别以发布到开发环境(-D 参数,其作用等同于 -save-dev 参数)的形式安装以下 3 个包。
-
eslint:
ESLint的核心包。 -
@typescript-eslint/parser:
ESLint的代码解析器,用于解析 TypeScript 代码。 -
@typescript-eslint/eslint-plugin:
ESLint插件,包含预定义的 TypeScript 代码规范。
ESLint 需要配置文件来设定检查规则,配置文件名为固定的 .eslintrc。在项目的根目录下创建名为 .eslintrc 的文件即可,文件内容如下。
{
"root": true,
"parser": "@typescript-eslint/parser",
"plugins": [
"@typescript-eslint"
],
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/eslint-recommended",
"plugin:@typescript-eslint/recommended"
]
}
以上代码中各部分的含义如下。
-
root:表示该配置文件是否为根配置,填入
true。 -
parser:自定义代码解析器,填入先前用
npm命令安装的 TypeScript 解析器。 -
plugins:
ESLint插件,填入先前用npm命令安装的typescript-eslint插件。 -
extends:设置
ESLint或插件中包含的检查规则。-
“eslint:recommended”:
ESLint推荐的内置检查规则。 -
“plugin:@typescript-eslint/eslint-recommended”:插件包含的规则之一,禁用了
eslint: recommended提供了但 TypeScript 编译器已能够检查的一部分规则。 -
“plugin:@typescript-eslint/recommended”:插件包含的规则之一,集成了一些推荐的检查规则。
-
并不是所有代码都要检查,例如,node_modules 目录下安装的包文件和测试代码可以不用检查。ESLint 使用固定名称为 .eslintignore 的配置文件来配置忽略检查的目录及文件。接下来,在项目根目录下创建名为 .eslintignore 的文件,文件内容如下。
node_modules
dist
testing
之后 ESLint 在检查时将忽略 node_modules、dist 和 testing 目录下的代码。
之后执行以下命令来检查 TypeScript 代码。
$ npx eslint . --ext .ts
如果终端没有任何输出,就说明代码完全符合代码规范。
假设 a.ts 文件如下。
let a: number = 1;
let b: boolean = true;
function isequal(a: any, b: any) {
return a = b;
}
console.log(isequal(a, b));
ESLint 的检查结果如图20-1所示,可以看到 ESLint 检查到 4 个错误和两个警告,它们分别如下。
-
错误1:从赋值为数值就可以推断出变量类型为数值类型,可以移除类型声明。
-
错误2:变量 a 没有再次赋值,可以用 const 关键字将其声明为常量。
-
错误3:从赋值为布尔值就可以推断出变量类型为布尔类型,可以移除类型声明。
-
错误4:变量 b 没有再次赋值,可以用 const 关键字将其声明为常量。
-
警告1:发现非预期的 any 类型,请指明一个具体的类型。
-
警告2:发现非预期的 any 类型,请指明一个具体的类型。
此时,可以根据提示修复对应的代码,也可以取消不必要的检查规则。
配置检查规则
可以在 .eslintrc 配置文件的 rules 属性中,配置检查规则。关于 ESLint 的全部规则,请参见 ESLint 的官网。
ESLint 对每种规则都有以下 3 种设置。
-
off:代表关闭规则。
-
warn:代表打开规则,显示警告。
-
error:代表打开规则,显示错误。
例如,将上一节的代码中涉及的部分规则的设置变更为 off 或 error,并添加一条 no-console 规则,当代码中存在 console 时就会显示警告。更改后的 .eslintrc 配置文件如下。
{
"root": true,
"parser": "@typescript-eslint/parser",
"plugins": [
"@typescript-eslint"
],
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/eslint-recommended",
"plugin:@typescript-eslint/recommended"
],
"rules": {
"@typescript-eslint/no-explicit-any": "error",
"prefer-const": "off",
"@typescript-eslint/no-inferrable-types": "off",
"no-console": "warn"
}
}
对上一节的示例代码执行 npx eslint . --ext .ts 命令,修改检查规则后的检查结果如图20-2所示。由于原本设置为 error 的 prefer-const 规则和 @typescript-eslint/no-inferrable-types 规则设置为 off,因此对应代码不再报错。而原本设置为 warn 的 @typescript-eslint/no-explicit-any 规则设置为 error,因此对应代码开始报错。而新增的 no-console 规则也开始生效,并显示了警告。它们分别如下。
-
错误1:发现非预期的
any类型,请指明一个具体的类型。 -
错误2:发现非预期的
any类型,请指明一个具体的类型。 -
警告:发现非预期的
console语句。