eslint-config-tencent
Version:
ESLint Config for Tencent
448 lines (446 loc) • 10.5 kB
JavaScript
/**
* ESLint Config for Tencent
* https://git.code.oa.com/standards/javascript
*
* 贡献者:
* xcatliu <xcaliu@tencent.com>
* ziofatli <ziofatli@tencent.com
*
* 依赖版本:
* eslint ^8.57.0
* @babel/eslint-parser ^7.14.5
* @typescript-eslint/parser undefined
* @typescript-eslint/eslint-plugin undefined
* eslint-plugin-import ^2.31.0
*
* 此文件是由脚本 scripts/build.ts 自动生成
*
* @reason 为什么要开启(关闭)此规则
*/
module.exports = {
files: ['**/*.ts', '**/*.tsx'],rules:{
'brace-style': 'off',
'no-empty-function': 'off',
// https://github.com/typescript-eslint/typescript-eslint/issues/491
'no-invalid-this': 'off',
'no-magic-numbers': 'off',
'react/sort-comp': 'off',
'func-call-spacing': 'off',
'comma-spacing': 'off',
'dot-notation': ['off', {}],
indent: 'off',
'keyword-spacing': 'off',
camelcase: 'off',
'no-underscore-dangle': 'off',
'no-array-constructor': 'off',
'no-dupe-class-members': 'off',
'no-undef': 'off',
'no-unused-vars': 'off',
'no-useless-constructor': 'off',
quotes: 'off',
semi: 'off',
'space-before-function-paren': 'off',
// https://git.woa.com/standards/javascript/issues/199
// https://github.com/typescript-eslint/typescript-eslint/issues/600
'spaced-comment': ['error', 'always', { markers: ['/'] }]
,
/**
* 重载的函数必须写在一起
* @reason 增加可读性
*/
'@typescript-eslint/adjacent-overload-signatures': "error",
/** 同 JS 规则的 TS 版本 */
'@typescript-eslint/brace-style': "error",
/** 同 JS 规则的 TS 版本 */
'@typescript-eslint/comma-spacing': [
"error",
{
"before": false,
"after": true
}
],
/**
* 类型断言必须使用 as Type,禁止使用 <Type>,禁止对对象字面量进行类型断言(断言成 any 是允许的)
* @reason <Type> 容易被理解为 jsx
*/
'@typescript-eslint/consistent-type-assertions': [
"error",
{
"assertionStyle": "as",
"objectLiteralTypeAssertions": "never"
}
],
/**
* 优先使用 interface 而不是 type
*/
'@typescript-eslint/consistent-type-definitions': "off",
/** 同 JS 规则的 TS 版本 */
'@typescript-eslint/dot-notation': [
"warn",
{}
],
/**
* 必须设置类的成员的可访问性
* @reason 将不需要公开的成员设为私有的,可以增强代码的可理解性,对文档输出也很友好
*/
'@typescript-eslint/explicit-member-accessibility': "off",
/**
* 要求或禁止在函数标识符和其调用之间有空格
*/
'@typescript-eslint/func-call-spacing': [
"error",
"never"
],
/** 同 JS 规则的 TS 版本 */
'@typescript-eslint/indent': [
"warn",
2,
{
"SwitchCase": 1,
"VariableDeclarator": 1,
"outerIIFEBody": 1,
"FunctionDeclaration": {
"parameters": 1,
"body": 1
},
"FunctionExpression": {
"parameters": 1,
"body": 1
},
"CallExpression": {
"arguments": 1
},
"ArrayExpression": 1,
"ObjectExpression": 1,
"ImportDeclaration": 1,
"flatTernaryExpressions": false,
"ignoredNodes": [
"JSXElement",
"JSXElement > *",
"JSXAttribute",
"JSXIdentifier",
"JSXNamespacedName",
"JSXMemberExpression",
"JSXSpreadAttribute",
"JSXExpressionContainer",
"JSXOpeningElement",
"JSXClosingElement",
"JSXFragment",
"JSXOpeningFragment",
"JSXClosingFragment",
"JSXText",
"JSXEmptyExpression",
"JSXSpreadChild"
],
"ignoreComments": false
}
],
/** 同 JS 规则的 TS 版本 */
'@typescript-eslint/keyword-spacing': [
"error",
{
"overrides": {
"if": {
"after": true
},
"for": {
"after": true
},
"while": {
"after": true
},
"else": {
"after": true
}
},
"before": true,
"after": true
}
],
/**
* 指定类成员的排序规则
* @reason 优先级:
* 1. static > instance
* 2. field > constructor > method
* 3. public > protected > private
*/
'@typescript-eslint/member-ordering': [
"error",
{
"default": [
"public-static-field",
"protected-static-field",
"private-static-field",
"static-field",
"public-static-method",
"protected-static-method",
"private-static-method",
"static-method",
"public-instance-field",
"protected-instance-field",
"private-instance-field",
"public-field",
"protected-field",
"private-field",
"instance-field",
"field",
"constructor",
"public-instance-method",
"protected-instance-method",
"private-instance-method",
"public-method",
"protected-method",
"private-method",
"instance-method",
"method"
]
}
],
/**
* 接口中的方法必须用属性的方式定义
*/
'@typescript-eslint/method-signature-style': "off",
/** 代替 JS 规则 camelCase 的 TS 规则 */
'@typescript-eslint/naming-convention': [
"warn",
{
"selector": "function",
"format": [
"camelCase",
"PascalCase"
]
},
{
"selector": "variable",
"format": [
"camelCase",
"UPPER_CASE"
]
},
{
"selector": "variable",
"modifiers": [
"global"
],
"format": [
"camelCase",
"PascalCase",
"UPPER_CASE"
]
},
{
"selector": "variable",
"format": [
"camelCase",
"PascalCase"
],
"types": [
"function"
]
},
{
"selector": "variable",
"modifiers": [
"exported"
],
"format": [
"UPPER_CASE"
],
"types": [
"boolean",
"string",
"number",
"array"
]
},
{
"selector": "variable",
"modifiers": [
"exported"
],
"format": [
"camelCase",
"PascalCase"
],
"types": [
"function"
]
},
{
"selector": [
"class",
"typeLike"
],
"format": [
"PascalCase"
]
},
{
"selector": [
"classMethod",
"classProperty"
],
"leadingUnderscore": "forbid",
"trailingUnderscore": "forbid",
"format": [
"camelCase"
]
}
],
/** 同 JS 规则的 TS 版本 */
'@typescript-eslint/no-array-constructor': "error",
/** 同 JS 规则的 TS 版本 */
'@typescript-eslint/no-dupe-class-members': "error",
/**
* 禁止定义空的接口
*/
'@typescript-eslint/no-empty-interface': "error",
/**
* 禁止给一个初始化时直接赋值为 number, string 的变量显式的声明类型
* @reason 可以简化代码
*/
'@typescript-eslint/no-inferrable-types': "warn",
/**
* 禁止对 promise 的误用,详见示例
*/
'@typescript-eslint/no-misused-promises': [
"error",
{
"checksConditionals": true
}
],
/**
* 禁止使用 namespace 来定义命名空间
* @reason 使用 es6 引入模块,才是更标准的方式。
* 但是允许使用 declare namespace ... {} 来定义外部命名空间
*/
'@typescript-eslint/no-namespace': [
"error",
{
"allowDeclarations": true,
"allowDefinitionFiles": true
}
],
/**
* 禁止在 optional chaining 之后使用 non-null 断言(感叹号)
* @reason optional chaining 后面的属性一定是非空的
*/
'@typescript-eslint/no-non-null-asserted-optional-chain': "error",
/**
* 禁止给类的构造函数的参数添加修饰符
*/
'@typescript-eslint/no-parameter-properties': "off",
/**
* 禁止使用 require
* @reason 统一使用 import 来引入模块,特殊情况使用单行注释允许 require 引入
*/
'@typescript-eslint/no-require-imports': "error",
/**
* 禁止将 this 赋值给其他变量,除非是解构赋值
*/
'@typescript-eslint/no-this-alias': [
"error",
{
"allowDestructuring": true
}
],
/**
* 禁止无用的表达式
*/
'@typescript-eslint/no-unused-expressions': [
"error",
{
"allowShortCircuit": true,
"allowTernary": true,
"allowTaggedTemplates": true
}
],
/** 同 JS 规则的 TS 版本 */
'@typescript-eslint/no-unused-vars': [
"error",
{
"args": "after-used",
"ignoreRestSiblings": true,
"argsIgnorePattern": "^_.+",
"varsIgnorePattern": "^_.+"
}
],
/**
* 禁止出现没必要的 constructor
*/
'@typescript-eslint/no-useless-constructor': "warn",
/**
* 使用 for 循环遍历数组时,如果索引仅用于获取成员,则必须使用 for of 循环替代 for 循环
* @reason for of 循环更加易读
*/
'@typescript-eslint/prefer-for-of': "warn",
/**
* 使用函数类型别名替代包含函数调用声明的接口
*/
'@typescript-eslint/prefer-function-type': "warn",
/**
* 禁止使用 module 来定义命名空间
* @reason module 已成为 js 的关键字
*/
'@typescript-eslint/prefer-namespace-keyword': "error",
/**
* 使用 optional chaining 替代 &&
*/
'@typescript-eslint/prefer-optional-chain': "error",
/** 同 JS 规则的 TS 版本 */
'@typescript-eslint/quotes': [
"warn",
"single",
{
"allowTemplateLiterals": false
}
],
/** 同 JS 规则的 TS 版本 */
'@typescript-eslint/semi': [
"error",
"always"
],
/** 同 JS 规则的 TS 版本 */
'@typescript-eslint/space-before-function-paren': [
"error",
{
"anonymous": "always",
"named": "never",
"asyncArrow": "always"
}
],
/**
* 禁止使用三斜杠导入文件
* @reason 三斜杠是已废弃的语法,但在类型声明文件中还是可以使用的
*/
'@typescript-eslint/triple-slash-reference': [
"error",
{
"path": "never",
"types": "always",
"lib": "always"
}
],
/**
* 在类型注释周围需要一致的间距
*/
'@typescript-eslint/type-annotation-spacing': "error",
/**
* interface 和 type 定义时必须声明成员的类型
*/
'@typescript-eslint/typedef': [
"error",
{
"arrayDestructuring": false,
"arrowParameter": false,
"memberVariableDeclaration": false,
"objectDestructuring": false,
"parameter": false,
"propertyDeclaration": true,
"variableDeclaration": false
}
],
/**
* 函数重载时,若能通过联合类型将两个函数的类型声明合为一个,则使用联合类型而不是两个函数声明
*/
'@typescript-eslint/unified-signatures': "error",},};