Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TSLint 和 Codelyzer 核心规则 #109

Open
deepthan opened this issue Nov 26, 2020 · 0 comments
Open

TSLint 和 Codelyzer 核心规则 #109

deepthan opened this issue Nov 26, 2020 · 0 comments

Comments

@deepthan
Copy link
Owner

TSLint 和 Codelyzer 核心规则

[TOC]

TSLint 核心规则

see tslint core rules

arrow-return-shorthand

(建议)将 () => { return x; } 简写成 () => x

callable-types

(建议)(TS Only)只有一个函数签名的接口或者字面类型可以写成函数类型。

class-name

(强制)类和接口名使用 Pascal 命名方式。

class Shape {}
interface SearchParam {}

comment-format

(强制)单行注释使用统一的格式规则。

可选参数如下:

  • check-space:所有单行注释必须以一个空格开头,即 // comment 形式
  • check-lowercase:注释第一个字母必须为小写字母(英文适用)
  • check-uppercase:注释第一个字母必须为大写字母(英文适用)

一个配置例子如下:

"comment-format": [true, "check-lowercase", {"ignore-words": ["TODO", "HACK"]}]

curly

(强制)不能省略 if/for/do/while 等语句的大括号。

eofline

(建议)每个文件必须以一个新行(newline)结尾。

forin

(建议)如果使用 for...in 语法,必须要使用 if 来过滤非自身属性。

for (let key in someObject) {
    if (someObject.hasOwnProperty(key)) {
        // code here
    }
}

import-blacklist

(建议)禁止直接使用 import 或者 require 整个模块;使用时,只能导入该模块的子模块。

例如,rxjs 代码库特别大,很多运算符都用不大,因此可以针对 rxjs 库编写规则如下:

"import-blacklist": [
    true,
    "rxjs"
]

import-spacing

(建议)保证 import 语句大括号旁边有�空格,也即:

import { Component, Pipe } from '@angular/core';

indent

(强制)缩进使用统一的 tabs 或 spaces。

例如设置4个空格的设置如下:

"indent": [true, "spaces", 4]

interface-over-type-literal

(TS Only)定义接口时,优先采用接口声明方式(interface T { ... }),而不是类型字面量形式(type T = { ... })。

label-position

(强制)只允许 label 出现在合理的位置,例如 (do/while/for/switch) 语句。

max-line-length

限定一行的最大长度,例如设置一行不能超过 140 个字符,设置如下:

"max-line-length": [
    true,
    140
]

member-access

(TS Only) 对类的成员需要显示声明可访问性。

可选参数如下:

  • "no-public":禁止指定 public,因为这是默认的
  • "check-accessor":强制 get/set 访问器需要显示声明�
  • "check-constructor":构造函数需要显示声明

member-ordering

强制成员顺序。

例如静态变量需要先于实例变量,变量先于函数,可以设置如下:

"member-ordering": [
    true,
    "static-before-instance",
    "variables-before-functions"
]

no-arg

禁止使用 arguments.callee,因为这让编译器无法�优化代码,会导致潜在的性能问题。

no-bitwise

禁止使用位运算符(除了 &| 外)。

no-console

禁止使用 console 语句(生产环境代码)。

no-construct

禁止直接使用 StringNumberBoolean 构造函数。

可以使用 Number(foo) 形式,但是不能使用 new Number(foo) 形式。

no-debugger

禁止出现 debugger 语句(生产环境代码)。

no-duplicate-super

如果构造函数中 super 调用出现了多次,给出警告。

no-empty

不允许出现空的语句块。

no-empty-interface

(TS Only) 禁止空的接口。

no-eval

禁止使用 eval 语句。

no-inferrable-types

(TS Only) 对于简单的�变量类型不需要显示指定类型(例如 number, string, boolean)。

class A {
    // recommend
    age = 18;

    // not recommend, because it can be easily inferred by the compiler
    name: string = 'xiaoming';
}

可选参数如下:

  • ignore-params:函数参数使用可推断类型
  • ignore-properties:类的属性使用可推断类型

一个例子如下:

"no-inferrable-types": [true, "ignore-params", "ignore-properties"]

no-misused-new

(TS Only) 如果显示给接口定义构造函数或者给类定义 new,给出警告。

no-non-null-assertion

(TS Only)禁止非空推断。

no-shadowed-variable

禁止覆盖变量声明。

no-string-literal

禁止非必要的字符串字面量访问,例如允许 obj[prop-erty],而不允许 obj['propety']

no-string-throw

不只是抛出简单的字符串

正确的

// throwing an Error from typical function, whether sync or async
if (!productToAdd) {
    throw new Error("How can I add new product when no value provided?");
}

错误的

// throwing a string lacks any stack trace information and other important data properties
if (!productToAdd) {
    throw ("How can I add new product when no value provided?");
}

no-switch-case-fall-through

禁止 case 语句 fall through(也就是没有用 break 语句)。

例如:

switch (foo) {
    case 1:
        someFunc(foo);
    case 2:
        someOtherFunc(foo);
}

然而这种是合理的(存在多个连续的 case 语句):

switch(foo) {
    case 1:
        someFunc(foo);
        /* falls through */
    case 2:
    case 3:
        someOtherFunc(foo);
}

no-trailing-whitespace

不允许尾部空格。

no-unnecessary-initializer

禁止 var/let 语句或者解构语句初始化成 undefined

no-unused-expression

禁止未使用的表达式语句(没有被赋值给变量或者函数调用)。

no-use-before-declare

变量�必须先声明后使用。

no-var-keyword

不允许使用 var 关键字。

no-consecutive-blank-lines
控制两块内容之间的空白行数量,2代表2行,如果不配置则默认为1。

"no-consecutive-blank-lines": [true, 2],

帮助维护代码库中的可读样式。
额外的空白行会占用额外的空间,并且对代码的语义理解没有什么帮助。当屏幕上可以容纳的组件更少时,就更难读取文件。如果你发现一个文件太大,你觉得有必要用额外的空行或注释来分割它们,考虑将你的文件分割成更小的文件。

object-literal-sort-keys

对象中的 key 必须按照字母表顺序排列,在避免 merge 冲突时有用。

one-line

一些特定的关键字需要出现在同一行,例如 catchfinallyelseopen-brace

// 推荐
try {

} catch {

} finally {

}

// 不推荐
if (foo) {

}
else {

}

prefer-const

优先使用 const。

quotemark

引号设置,例如设置使用单引号:

"quotemark": [true, "single"]

radix

parseInt 必须提供进制参数。

semicolon

分号设置,例如设置必须要分号:

"semicolon": ["always"]

triple-equals

比较需要使用 ===!==

可选参数如下:

  • "allow-null-check" 当比较 null 时可以使用 == 和 !=
  • "allow-undefined-check" 当比较 undefined 时可以使用 == 和 !=

typedef-whitespace

(TS Only) 类型定义时需不需要空格。

"typedef-whitespace": [
    true,
    {
        "call-signature": "nospace",
        "index-signature": "nospace",
        "parameter": "nospace",
        "property-declaration": "nospace",
        "variable-declaration": "nospace"
    }
]

typeof-compare

保证 typeof 和正确的字符串类型来比较。

unified-signatures

(TS Only) 如果两个函数可以�通过 optional 和 rest 参数合并成一个,给出警告。

variable-name

检测变量名称可能出现的各种错误。

whitespace

强制空格样式规范。

ordered-imports
将import语句导入的内容按字母顺序排列并进行分组。
例如

import { b, c, a } from "d";

得改成

import { a, b, c } from "d";

Codelyzer 核心规则

see codelyzer core rules

directive-selector

指令选择器允许命名方式。

"directive-selector": [
    true,
    "attribute",
    "app",
    "camelCase"
]

component-selector

组件选择器允许命名方式。

"component-selector": [
    true,
    "element",
    "app",
    "kebab-case"
]

use-input-property-decorator

使用 @Input() 装饰器,而不是组件或者指令元数据中的 inputs 属性。

use-output-property-decorator

使用 @Output() 装饰器,而不是组件或者指令元数据中的 outputs 属性。

use-host-property-decorator

使用 @HostProperty 装饰器而不是组件或者指令元数据中的 host 属性。

no-input-rename

是否允许重命名 Input 变量。

no-output-rename

是否允许重命名 Output 变量。

use-life-cycle-interface

如果使用生命周期函数,必须在组件中实现该接口。

use-pipe-transform-interface

管道必须实现 PipeTransform 接口。

component-class-suffix

组件名必须添加 Component 后缀(后缀可自定义)。

directive-class-suffix

指令名必须添加 Directive 后缀(后缀可自定义)。

no-access-missing-member

不允许在模板中使用组件中不存在的属性和方法。

"no-output-on-prefix"

  • 坚持命名事件时,不要带前缀 on。

  • 坚持把事件处理器方法命名为 on 前缀之后紧跟着事件名。

  • 为何?与内置事件命名一致,例如按钮点击。

  • 为何?Angular 允许另一种备选语法 on-*。如果事件的名字本身带有前缀 on,那么绑定的表达式可能是 on-onEvent。
    output事件触发器回调的函数不加on前缀,因为不加的话可以与按钮点击事件保持一致,并且angular支持on-*方法,

templates-use-public

模板中只能使用 public 属性和方法。

invoke-injectable

服务必须使用 @Injectable() 装饰。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant