TSLint配置规则(部分)

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则指这个值确实存在但是还没有指向任何值。


  • 配置禁止声明为nullundefined的联合类型的成员或者返回值,配置示例:
"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中,使用constlet来代替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

Maintainability(可维护性)

你可能感兴趣的:(TSLint配置规则(部分))