TSLint配置规则(部分)
参照 https://palantir.github.io/tslint/rules/
检索key为配置项的key。
以下配置均配置在tslint.json中。
部分配置项目可能不全,具体参考官网。
TypeScript-specific(ts特有)
- 配置禁用
@ts-ignore
注释,配置示例:
"ban-ts-ignore": true
在这种情况下,以下无效的代码会报警告而无法忽略:
if (false) {
// @ts-ignore: Unreachable code error
console.log("hello");
}
- 配置访问权限,配置示例:
"member-access": true "member-access": [true, "no-public"] "member-access": [true, "check-accessor"]
设置为no-public
或者true
禁止指定参数的访问权限为public;
设置为check-accessor
强制性转换get和set的方法为public权限; 更多配置参见官网。
- 配置属性以及方法的code顺序,配置示例:
“member-ordering": fields-first “member-ordering": instance-sandwich “member-ordering": statics-first
一般选用fields-first
,这种情况下的排序规则是:
* 属性在构造方法之前,构造方法在方法之前
* 静态成员在实例成员之前
* public成员在protect成员之前,protect成员在private成员之前
其他两种排序参考官网。
- 配置禁用
any
类型修饰符,配置示例:
"no-any": true "no-any": [true,{"ignore-rest-args": true}]
一般使用第二个配置,这种情况下,作为多参数传入的数组参数将不会被限制使用any。
例如以下的写法将会通过检查:
function foo(a: number, ...rest: any[]): void {
return;
}
- 配置禁用空接口,配置示例:
"no-empty-interface": true
- 配置禁用
for ... in
语句
"no-for-in": true
for…in
语句是旧式JavaScript语法,通常需要在其循环体内进行详细的hasOwnProperty检查。 这些语句可以完全用现代JS&TS中的for…of
语句代替。
- 配置防止
import
语句引入具有副作用的依赖,配置示例:
"no-import-side-effect": true "no-import-side-effect": [true, {"ignore-module": "(\\.html|\\.css)$"}]
一般使用第一种即可。
- 配置禁止显示声明string、boolean、number型的变量,配置示例:
"no-inferrable-types": true "no-inferrable-types": [true, "ignore-params"] "no-inferrable-types": [true, "ignore-params", "ignore-properties"]
由于编译器可以很容易地推断出这三种类型,所以禁止这三种类型的声明,减少代码冗余。
"ignore-params", "ignore-properties"
表示忽略函数以及类属性的检查。
- 配置禁止内部模块,配置示例:
"no-internal-module": true
使用模块的概念可能会与外部模块混淆,建议使用命名空间的概念(后续有类似的配置)。
- 配置禁止使用Magic Number,配置示例:
"no-magic-numbers": [true, 1, 2, 3] "no-magic-numbers": [true, {"allowed-numbers": [1, 2, 3], "ignore-jsx": true}]
不允许在变量分配之外使用常量值,默认的情况下,-1,0和1将会是允许值。
强制常量值存储在变量中将会提供更高的可读性。
- 配置禁用内部模块以及命名空间,配置示例:
"no-namespace": true
原因及理由同"no-internal-module"
配置。此外,这项规则并不会禁止 declare module ... {}
。剩余配置参照官网。
- 配置禁用"!"后缀,配置示例:
"no-non-null-assertion": true
在严格模式下,coder应该提前做好non-null check。(未定义的参数加上?也可防止空指针-> undefind?.do())
举例,一般情况下(未配置这项规则):
function foo(instance: MyClass | undefined) {
instance!.doWork();
}
假设instance存在,这种情况下不会报错。编码时应该如下做好non-null check:
function foo(instance: MyClass | undefined) {
if (instance !== undefined) {
instance.doWork();
}
}
- 配置禁止重新分配参数,配置示例:
"no-parameter-reassignment": true
- 配置禁用
require
语句,配置示例:
"no-var-requires": true
禁用类似var module = require("module")
的语句,只能在import语句中使用require
import foo = require('foo')
- 配置禁用传统的无箭头函数,配置示例:
"only-arrow-functions": true "only-arrow-functions": [true, "allow-declarations", "allow-named-functions"]
一般采用第二项配置。允许独立的函数定义不使用箭头函数。但是不允许function(){}
形式
注意:如果函数体中有this
指向,那么本项配置将会被忽略。因为传统函数不会绑定this的作用域,在函数中有this的情况下,会导致作用域不一致。
- 配置使用for...of代替传统的for循环,配置示例:
"prefer-for-of": true
如果循环的index没有特殊用途,那么建议使用for..of。
- 配置函数以及属性需要定义返回类型及类型,配置示例:
"typedef": [true, "call-signature", "parameter", "member-variable-declaration"]
更多配置项参见官网,一般上述配置即够用。
- 配置参数重载警告,配置示例:
"unified-signatures": true
Functionality(功能性)
- 配置检查异步函数,配置示例:
"promise-function-async": true "promise-function-async": [true, "check-function-declaration", "check-method-declaration"]
检查函数类型,一般使用第一个默认配置即可。
- 配置异步调用检查,配置示例:
"await-promise": true "await-promise": [true, "Thenable"]
一般配置第一项即可。
- 配置禁用逗号运算符,配置示例:
"ban-comma-operator": true
举例:
let x = (y = 1, z = 2); // x is equal to 2 - this may not be immediately obvious.
上式x=2
,这种写法语义不明确。
- 配置禁止省略花括号,配置示例:
"curly": true
if/for/do/while
语句的花括号不可省略。
- 配置使用
if
条件过滤for...in
语句,配置示例:
"forin": true
防止在循环中迭代到原型中拥有的属性。
举例(someObject的prototype中也会拥有可观的属性数量):
for (let key in someObject) {
if (someObject.hasOwnProperty(key)) {
// code here
}
}
- 配置禁用内置的Function构造函数,配置示例:
"function-constructor": true
直接使用Function构造函数会导致设计上的问题,同时会导致性能低下,如果需要动态创建function,应该使用工厂函数来返回function。
以下写法将会警告:
let doesNothing = new Function();
应该改为:
let doesNothing = () => {};
- 配置只允许在合适的位置使用流程控制标签,配置示例:
"label-position": true
本项规则只会允许在流程控制中的标签。
频繁使用流程控制标签会使代码结构性变差。
- 配置禁用
arguments.callee
的写法,配置示例:
"no-arg": true
具体原因参照https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments/callee
- 配置有异步标签的函数需要在返回值前加上
await
,配置示例:
"no-async-without-await": true
举例,以下是正确的写法:
async function f() {
await fetch();
}
const f = async () => {
await fetch();
};
const f = async () => {
return 'value';
};
- 配置禁用位运算符,配置示例:
"no-bitwise": true
禁用下列运算符 &
, &=
, |
, |=
, ^
, ^=
, <<
, <<=
, >>
, >>=
, >>>
, >>>=
, ~
.
不会禁用&
,|
.
- 配置禁止在流程控制中使用类型分配,配置示例:
"no-conditional-assignment": true
举例,不允许以下写法:
if (var1 = var2)
只能在流程控制中使用正常的类型判断:
if (var1 = var2)
- 配置禁用指定的console函数,配置示例:
"no-console": [true, "log", "error"]
生产环境中,console函数并不适用。
- 配置禁用String,Number,Boolean的构造函数,配置示例:
"no-construct": true
禁用类似 new Number(foo)
的写法,但是不禁用Number(foo)
的写法。
- 配置禁用
debugger
语句,配置示例:
"no-debugger": true
debugger
语句不适用于生产环境。
- 配置禁止在函数中出现两次
super()
,配置示例:
"no-duplicate-super": true
第二次出现的super()
会在运行时失败。
- 配置禁止多重
switch
,配置示例:
"no-duplicate-switch-case": true
- 配置禁止在同一代码块中两次声明同一个变量,配置示例:
"no-duplicate-variable": true "no-duplicate-variable": [true, "check-parameters"]
一般使用第一项即可。
本项规则只会对var
声明起作用。
- 配置禁用
delete
操作符,配置示例:
"no-dynamic-delete": true
尽量使用Map
或者Set
,来存储,Object
使用delete
会偶尔引起不可预知的错误(性能低下)。
- 配置禁止空代码块,配置示例:
"no-empty": true "no-empty": [true, "allow-empty-catch"] "no-empty": [true, "allow-empty-functions"] "no-empty": [true, "allow-empty-catch", "allow-empty-functions"]
一般使用第一项配置即可,代码块中有注释时并不会被认为是空代码块。
- 配置禁用
eval
函数,配置示例:
"no-eval": true
- 配置禁止出现未处理的
Promise
,配置示例:
"no-floating-promises": true "no-floating-promises": [true, "JQueryPromise"]
一般使用第一项即可,第二项的参数指定了额外的处理项目。
- 配置禁止使用
for...in
来迭代一个数组,配置示例:
"no-for-in-array": true
如果要遍历索引,以下代码可以参照:
array.forEach((value, index) => { … });
for (const [index, value] of array.entries()) { … }
for (let i = 0; i < array.length; i++) { … }
- 配置禁止引用
package.json
范围外的包,配置示例:
"no-implicit-dependencies": true
- 配置禁止空花括号对象({ }),配置示例:
"no-inferred-empty-object-type": true
因为编译器无法推断其类型。
- 配置禁止在非模板中使用${}语句,配置示例:
"no-invalid-template-strings": true
- 配置禁止在类范围外使用
this
,配置示例:
"no-invalid-this": true
- 配置禁止为类或者接口重新定义构造函数,配置示例:
"no-misused-new": true
如果想要声明一个称为类的函数,那么最好使用declare class
。
- 配置禁止使用
null
语法,配置示例:
"no-null-keyword": true
在JavaScript中,undefined
一般指不存在并且没有任何指向的值,而null
则指这个值确实存在但是还没有指向任何值。
- 配置禁止声明为
null
和undefined
的联合类型的成员或者返回值,配置示例:
"no-null-undefined-union": true
- 配置禁止在定义对象时使用as类型断言符号,配置示例:
"no-object-literal-type-assertion": true
以下写法会通过检查:
let foo = {} as any;
let foo = {} as unknown;
let foo = {} as any as Foo;
let foo = {} as unknown as Foo;
const x: T = { ... };
以下写法将不会通过检查:
let foo = {} as Foo;
let foo = {};
- 配置警告在
if
条件中使用Promise函数作为条件,配置示例:
"no-promise-as-boolean": true
举例,以下写法将会通过检查:
async function waiter(custumerDecisionPromise: Promise) {
if (await custumerDecisionPromise) {
console.log("Customer ready to take an order.")
}
}
以下写法将会警告:
async function waiter(custumerDecisionPromise: Promise) {
if (custumerDecisionPromise) {
console.log("Customer ready to take an order.")
}
}
- 配置禁止指定的全局变量名,配置示例:
"no-restricted-globals": [true, "name", "length", "event"]
可以根据需要添加,以上是三个字符串默认的列表。
- 配置禁止不必要的
return await
,配置示例:
"no-return-await": true
异步函数总是在Promise中包含了返回值,使用await
只会增加等待时间而不会改变语义。
- 配置禁止阴影变量的声明,配置示例:
"no-shadowed-variable": true
当一个本地变量和局部变量重名时,就会产生阴影变量(shadow),这将会混淆语义。
- 配置禁止数组缺少元素,配置示例:
"no-sparse-arrays": true
缺少元素会导致重复的逗号,这是不必要的。
以下写法将会通过检查:
const arr: string[] = ['elemenet1', 'element2'];
以下写法将会警告:
const arr: string[] = ['elemenet1',, 'element2'];
- 配置禁止不必要的
['propertyName']
来访问对象属性,配置示例:
"no-string-literal": true
允许 obj["prop-erty"]
方式( can’t be a regular property access ),不允许 obj["property"]
(应该用 obj.property
).。
- 配置不允许抛出一个字符串,配置示例:
"no-string-throw": true
字符串或者基本类型并不是一个可抛出的错误对象类型。
举例,以下写法将通过检查:
try {
// ...
} catch (e) {
throw e;
}
以下写法将会警告:
try {
// ...
} catch {
throw 'There was a problem.';
}
- 配置禁止引入子模块,配置示例:
"no-submodule-imports": true
- 配置禁止不显示声明的
fall-through
,配置示例:
"no-switch-case-fall-through": true
在switch
分支中的 Fall though
一般是bug。
在JavaScript中,如果switch的case后不中断,那么代码会继续执行,这叫做Fall Through
。
除非逻辑上需求,coder故意进行Fall Through,那么其他情况下,编译会报出警告。
举例,编码时因需求确实不需要break
,如下情况逻辑上无措,但是没有显示指明,则会报出警告:
switch(foo) {
case 1:
someFunc(foo);
case 2:
someOtherFunc(foo);
}
正确做法如下(加上注释指明):
switch(foo) {
case 1:
someFunc(foo);
/* falls through */
case 2:
case 3:
someOtherFunc(foo);
}
- 配置类型相同的逻辑比较,配置示例:
"no-tautology-expression": true
在进行比较时,相同类型的才进行比较。
例如:3 === 3, someVar === someVar, “1” > “1”
- 配置禁止this的再定义,配置示例:
"no-this-assignment": true
在ES6中,可以使用 lambdas 表达式来解决this的指向问题。
例如,ES6以前:
const self = this;
setTimeout(function () {
self.doWork();
});
ES6(在胖箭头函数中已经保留了this的作用域):
setTimeout(() => {
this.doWork();
});
- 配置当一个方法在作用域之外被调用时报出警告,配置示例:
"no-unbound-method": true
当类被实例化成为一个实例的时候,类方法的作用域将不在类实例中,而在window/global
中,例如以下代码的log()
函数将会调用window/global
作用域的函数:
class MyClass {
public log(): void {
console.log(this);
}
}
const instance = new MyClass();
const log = instance.log;
log(); // 调用的是全局的log()函数
这种情况下应该使用ES6的箭头函数(会保留当前调用者的作用域)或者指定作用域:
class MyClass {
public logArrowBound = (): void => {
console.log(bound);
};
public logManualBind(): void {
console.log(this);
}
}
const instance = new MyClass();
// 箭头函数的作用域指向当前调用它的地方,这里指向了instance
const logArrowBound = instance.logArrowBound;
// 绑定当前作用域
const logManualBind = instance.logManualBind.bind(instance);
logArrowBound();
logManualBind();
- 配置禁用非必要的类,配置示例:
"no-unnecessary-class": true "no-unnecessary-class": ["allow-static-only", "allow-constructor-only"]
一般使用第二项,保留类似OO风格语言的工具类作用。
- 配置禁止不安全的
any
类型,配置示例:
"no-unsafe-any": true
推荐使用泛型。
- 配置禁止不安全的
finally
块,配置示例:
"no-unsafe-finally": true
禁止在finally块中使用流程控制语句,例如return,continue,break,throws
。
- 配置禁用无用代码块,配置示例:
"no-unused-expression": true
- 配置禁用无用的参数,配置示例:
"no-unused-variable": true
- 配置禁止在声明或者引入之前使用参数,配置示例:
"no-use-before-declare": true
- 配置禁用
var
,配置示例:
"no-var-keyword": true
ES6中,使用const
和let
来代替var
。
- 配置建议使用条件表达式而不是每个if分支都去做类似的工作,配置示例:
"prefer-conditional-expression": true "prefer-conditional-expression": [true, "check-else-if"]
一般使用第二项(嵌套的if语句也会被检查)。
- 配置使用ES2018的展开运算符来进行对象合并,而不是用(
Object.assign()
),配置示例:
"prefer-object-spread": true
举例:
function sum(x, y, z) {
return x + y + z;
}
const numbers = [1, 2, 3];
console.log(sum(...numbers)); // 这里的...numbers指的就是上面定义的数组
// expected output: 6
let obj1 = [1,2,3];
let obj2 = [4,5];
let obj3 = [...obj1,...obj2]; // => obj3 = [1,2,3,4,5]
- 配置在使用
parseInt
时加上进制参数,配置示例:
"radix": true
举例,以下写法将会通过检查:
const x: string = '11';
const dec: number = parseInt(x, 10);
以下将会报警告:
const x: string = '11';
const dec: number = parseInt(x);
- 配置参数相加时,参数类型必须相同(
number
或者string
),配置示例:
"restrict-plus-operands": true
- 配置禁止在
static
函数中使用this
,配置示例:
"static-this": true
- 配置限制出现在布尔类型表达式中的值,默认情况下只允许boolean值,配置示例:
"strict-boolean-expressions": true "strict-boolean-expressions": [true, "allow-boolean-or-undefined"]
一般使用第二项,这种情况下,null值将不会通过检查,例如:!null
将不会通过检查。
更多配置参照官网。
- 配置只允许在基类类型中进行比较,配置示例:
"strict-comparisons": true
更多配置参照官网。
- 配置禁止隐式的
toString()
调用,配置示例:
"strict-string-expressions": true
'foo' + bar
将不会通过检查。
- 配置当表达式总为true或者false时候报出警告,配置示例:
"strict-type-predicates": true
- 配置switch表达式中必须有default项,配置示例:
"switch-default": true
- 配置实用三等号替代双等号,配置示例:
"triple-equals": true
- 配置确保使用typeof时和正确的string字符串进行比较,配置示例:
"typeof-compare": true
- 配置禁用不必要的(空的)构造函数,配置示例:
"unnecessary-constructor": true
- 配置如果显示声明的参数类型是其默认值,则显示警告,配置示例:
"use-default-type-parameter": true
- 配置使用
isNaN()
函数来判断NaN
值,配置示例:
"use-isnan": true