{
    "defaultSeverity": "error",
    "rules": {
        /********* TypeScript Specific ********/
        /* These rules find errors related to TypeScript features */
        // 必须显式声明成员可见性
        "member-access": true,
        // 禁止 any
        "no-any": {
            "severity": "warning"
        },
        // 禁止内部 module
        "no-internal-module": true,
        // 禁止 namespace，除了declare
        "no-namespace": {
            "severity": "error",
            "options": "allow-declarations"
        },
        // 禁止 <reference>
        // "no-reference": true,
        // 禁止 magic number
        // "no-magic-numbers": {
        //     "severity": "warning"
        // },
        // 禁止 var xxx = requires(xxx)
        "no-var-requires": {
            "severity": "warning"
        },
        // 推荐使用 for-of
        // "prefer-for-of": {
        //     "severity": "warning"
        // },
        /********** Functionality **********/
        /* These rules catch common errors in JS programming or otherwise confusing constructs that are prone to producing bugs */
        // Warns for an awaited value that is not a Promise.
        "await-promise": true,
        // if/for 等后必须加代码块
        "curly": true,
        // 使用 for-in 时必须检查 key 的持有
        "forin": true,
        // 禁用 arguments.callee
        "no-arg": {
            "severity": "warning"
        },
        // 禁止条件表达式中出现赋值操作符
        "no-conditional-assignment": true,
        // 禁止对 Number, String 等使用new
        "no-construct": true,
        // 禁止多次调用 super()
        "no-duplicate-super": true,
        // 禁止重复声明变量
        "no-duplicate-variable": true,
        // 禁止 eval
        "no-eval": {
            "severity": "warning"
        },
        // promise 必须最终被处理（then、catch）
        "no-floating-promises": {
            "severity": "off"
        },
        // 禁止对 array 使用 for-in
        "no-for-in-array": true,
        // 禁止在 class 外部使用 this  // 关了
        "no-invalid-this": {
            "severity": "off"
        },
        // 禁止通过字符串访问对象属性
        "no-string-literal": {
            "severity": "warning"
        },
        // 禁止 throw 字符串
        "no-string-throw": true,
        // Warns when a method is used as outside of a method call.
        "no-unbound-method": {
            "severity": "warning"
        },
        // Warns when using an expression of type ‘any’ in an unsafe way. Type casts and tests are allowed. Expressions that work on all values (such as ‘”” + x’) are allowed.
        "no-unsafe-any": {
            "severity": "warning"
        },
        // 禁止在 finally 中使用控制代码，如 return, continue, break and throws
        "no-unsafe-finally": true,
        // 禁止未使用的表达式
        "no-unused-expression": {
            "severity": "warning",
            "options": [
                "allow-fast-null-checks",
                "allow-new"
            ]
        },
        // 禁止未使用的变量
        "no-unused-variable": {
            "severity": "warning"
        },
        // 禁止在声明前使用变量（这个规则检查的有问题，先禁用了）
        // "no-use-before-declare": {
        //     "severity": "error"
        // },
        // 禁止 var
        "no-var-keyword": true,
        // Requires expressions of type void to appear in statement position.
        "no-void-expression": {
            "severity": "off"
        },
        // parseInt 必须传入进制
        "radix": {
            "severity": "off"
        },
        // 数字和字符串相加时，两者必须类型相同
        "restrict-plus-operands": {
            "severity": "off"
        },
        // （有问题暂时先关了）严格限制 boolean 类型
        "strict-boolean-expressions": {
            "severity": "off",
            "options": [
                "allow-null-union",
                "allow-undefined-union",
                "allow-string",
                "allow-number"
            ]
        },
        // (有问题暂时先关了) Warns for type predicates that are always true or always false. Works for ‘typeof’ comparisons to constants (e.g. ‘typeof foo === “string”’), and equality comparison to ‘null’/’undefined’. (TypeScript won’t let you compare ‘1 === 2’, but it has an exception for ‘1 === undefined’.) Does not yet work for ‘instanceof’. Does not warn for ‘if (x.y)’ where ‘x.y’ is always truthy. For that, see strict-boolean-expressions.
        "strict-type-predicates": {
            "severity": "off"
        },
        // switch 必须有 default
        "switch-default": {
            "severity": "warning"
        },
        // 必须使用 ===，除了对于判断 null 和 undefined
        "triple-equals": {
            "severity": "error",
            "options": [
                "allow-null-check",
                "allow-undefined-check"
            ]
        },
        // Makes sure result of typeof is compared to correct string values
        "typeof-compare": {
            "severity": "warning"
        },
        // 禁止使用 ==NaN
        "use-isnan": true,
        /********** Maintainability **********/
        /* These rules make code maintenance easier */
        // 限制 if 等分支控制代码的圈复杂度
        "cyclomatic-complexity": {
            "severity": "off"
        },
        // 末尾空行
        "eofline": true,
        // 缩进
        "indent": {
            "severity": "error",
            "options": "spaces"
        },
        // 换行符
        // "linebreak-style": {
        //     "severity": "error",
        //     "options": "LF"
        // },
        // 限制一个文件中能出现的 class 数量
        "max-classes-per-file": {
            "severity": "warning",
            "options": 10
        },
        // 限制一个文件的行数
        "max-file-line-count": {
            "severity": "warning",
            "options": 1000
        },
        // 限制一行代码的长度
        "max-line-length": {
            "severity": "warning",
            "options": 500
        },
        // 禁止 default 导出
        "no-default-export": {
            "severity": "off"
        },
        // 禁止使用 require 导入
        "no-require-imports": {
            "severity": "off"
        },
        // 末尾逗号限制：多行必须加，单行不可加
        "trailing-comma": {
            "severity": "error",
            "options": [
                {
                    "multiline": "always",
                    "singleline": "never"
                }
            ]
        },
        /*********** Style ***********/
        /* These rules enforce consistent style across your codebase */
        // array 类型使用 Array<T> 的写法
        // "array-type": {
        //     "severity": "error",
        //     "options": "generic"
        // },
        // Suggests to convert () => { return x; } to () => x.
        "arrow-return-shorthand": {
            "severity": "off",
            "options": [
                "multiline"
            ]
        },
        // 类和接口使用 PascalCased 方式命名
        "class-name": true,
        // 单行注释必须以空格开始
        "comment-format": {
            "severity": "warning",
            "options": [
                "check-space"
            ]
        },
        // 强制文档注释
        "completed-docs": {
            "severity": "warning",
            "options": [
                {
                    "classes": {
                        "visibilities": "all"
                    },
                    "enums": {
                        "visibilities": "all"
                    },
                    "functions": {
                        "visibilities": "exported"
                    },
                    "methods": {
                        "privacies": "protected"
                    },
                    "types": {
                        "visibilities": "exported"
                    }
                }
            ]
        },
        // 文件头部必须有声明
        // "file-header": {
        //     "severity": "warning",
        //     "options": [
        //         "Copyright \\d{4}"
        //     ]
        // },
        // Ensures proper spacing between import statement keywords
        "import-spacing": true,
        // 接口命名前面不要加 I
        "interface-name": {
            "severity": "warning",
            "options": [
                "never-prefix"
            ]
        },
        // 推荐用interface代替type别名
        "interface-over-type-literal": {
            "severity": "warning"
        },
        // return 前必须空一行，除非只有这一句
        // "newline-before-return": {
        //     "severity": "off"
        // },
        // new 必须加括号
        "new-parens": true,
        // 类型转换要使用 xx as T，而非 <T>xx
        // "no-angle-bracket-type-assertion": true,
        // 不要与 boolean 做比较（xx === true）
        "no-boolean-literal-compare": {
            "severity": "warning"
        },
        // 禁止连续空行（最多允许连续 2 个）
        "no-consecutive-blank-lines": {
            "severity": "warning",
            "options": 2
        },
        // 禁止行末空格
        "no-trailing-whitespace": {
            "severity": "warning",
            "options": [
                "ignore-comments"
            ]
        },
        // Warns when a namespace qualifier (A.x) is unnecessary.
        "no-unnecessary-qualifier": {
            "severity": "warning"
        },
        // object 字面量的 key 不要加引号，除非含有特殊字符
        // "object-literal-key-quotes": {
        //     "severity": "warning",
        //     "options": [
        //         "as-needed"
        //     ]
        // },
        // catch 等应与前一个右括号在同一行，且应有空格隔开
        // "one-line": {
        //     "severity": "error",
        //     "options": [
        //         "check-catch",
        //         "check-finally",
        //         "check-else",
        //         "check-open-brace",
        //         "check-whitespace"
        //     ]
        // },
        // 禁止一行内声明多个变量，除了 for 循环头部
        "one-variable-per-declaration": {
            "severity": "error",
            "options": "ignore-for-loop"
        },
        // import 必须按字母顺序排列
        // "ordered-imports": {
        //     "severity": "warning"
        // },
        // 没有使用到 this 的成员方法，应考虑改写为公共函数（只检查 private 方法）
        // "prefer-function-over-method": {
        //     "severity": "warning",
        //     "options": [
        //         "allow-public",
        //         "allow-protected"
        //     ]
        // },
        // 接口中定义方法应使用 foo(): void 形式，而非 foo: () => void 形式
        "prefer-method-signature": {
            "severity": "warning"
        },
        // 使用模板字符串而非字符串相加（允许加一次）
        "prefer-template": {
            "severity": "warning",
            "options": [
                "allow-single-concat"
            ]
        },
        // 使用单引号，其内部允许使用双引号，对于jsx使用双引号
        // "quotemark": {
        //     "severity": "error",
        //     "options": [
        //         "single",
        //         "avoid-escape",
        //         "jsx-double"
        //     ]
        // },
        // void方法中，return后不能接undefined，有返回值的方法反之
        "return-undefined": true,
        // 必须加分号
        "semicolon": {
            "severity": "error",
            "options": [
                "always"
            ]
        },
        // 函数中，括号前需要加空格：匿名函数、异步箭头函数必须加，命名函数不可添加
        "space-before-function-paren": {
            "severity": "warning",
            "options": [
                {
                    "anonymous": "always",
                    "named": "never",
                    "asyncArrow": "always"
                }
            ]
        },
        // if 等后面，运算符两侧，逗号后面等地方，必须加空格
        "whitespace": {
            "severity": "warning",
            "options": [
                "check-branch",
                "check-decl",
                "check-operator",
                "check-module",
                "check-separator",
                "check-type",
                "check-typecast",
                "check-preblock"
            ]
        },
        //**************** v5.1.0 *********************
        //**************** v5.2.0 *********************
        // Disallow irregular whitespace outside of strings and comments
        "no-irregular-whitespace": true,
        // Warns when deprecated APIs are used.
        "deprecation": true,
        //**************** v5.3.0 *********************
        // Enforces UTF-8 file encoding.
        "encoding": true
    }
}
