我可以关闭 eslint tyfedef 规则以在 lambda 中进行解构吗

Can I turn off eslint tyfedef rule for destructuring in lambdas

我想知道是否可以仅针对 lambda 中的数组或对象解构关闭 typedef 规则?

getPersonsNames(): string[] {
    type Person = { name: string; age: number };
    const persons: Person[] = [
        { name: `Jan Kowalski`, age: 12 },
        { name: `Justyna Kowalczyk`, age: 22 }
    ];
    return persons.map(({ name }) => name); // ESLint: Expected a type annotation.(@typescript-eslint/typedef)
}

一般来说,我想使用 typedfees 进行解构,但在那种情况下我不想这样做。有没有办法排除这些情况?


我试图将 'arrow-parameter': false,(和 arrowParameter: false 如上所示)添加到 @typescript-eslint/typedef 但它根本没有帮助。

Documentation of this rule which I used: @typescript-eslint/typedef

要复制的文件

.eslintrc.js 配置文件:

module.exports = {
    parser: '@typescript-eslint/parser',
    parserOptions: {
        project: './tsconfig.json',
        createDefaultProgram: true,
        ecmaVersion: 2020,
        sourceType: 'module',
    },
    extends: [
        'eslint:recommended',
        'plugin:@typescript-eslint/recommended',
    ],
    rules: {
        '@typescript-eslint/typedef': [
            'error',
            {
                'arrowParameter': false,
                'propertyDeclaration': true,
                'parameter': true,
                'memberVariableDeclaration': true,
                'callSignature': true,
                'variableDeclaration': true,
                'arrayDestructuring': true,
                'objectDestructuring': true
            }
        ],
    },
}

.gitignore:

node_modules

index.ts:

function getPersonsNames(): string[] {
    type Person = { name: string; age: number };
    const persons: Person[] = [
        { name: `Jan Kowalski`, age: 12 },
        { name: `Justyna Kowalczyk`, age: 22 }
    ];
    return persons.map(({ name }) => name); // ESLint: Expected a type annotation.(@typescript-eslint/typedef)
}

getPersonsNames();

package.json:

{
  "name": "typedef-in-destructuring-lambdas",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "lint": "eslint . --ext .ts"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@typescript-eslint/eslint-plugin": "^4.3.0",
    "@typescript-eslint/parser": "^4.3.0",
    "eslint": "^7.10.0",
    "typescript": "^4.0.3"
  }
}

tsconfig.json:

{
    "compilerOptions": {
        "target": "ES2017",
        "module": "commonjs",
        "moduleResolution": "node",
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "allowSyntheticDefaultImports": true,
        "sourceMap": true,
        "noEmit": true,
        "noEmitHelpers": true,
        "importHelpers": true,
        "strictNullChecks": false,
        "skipLibCheck": true,
        "lib": [
            "dom",
            "es6",
            "es2019"
        ]
    }
}

该规则不支持这一点 - 它将所有解构视为相同。
请注意,更多的可定制性不会添加到规则中,因为它不应该在大多数代码库中使用。

使用它并添加不必要的类型注释是 anti-pattern,会对您的代码库产生负面影响。


此规则并不是真正打算在代码库中使用 day-to-day,它旨在帮助您迁移代码库,以便您可以打开 noImplicitAny 编译器选项。

到处都是不必要的类型注释对您的代码库不利。每一个都会产生维护成本(你必须手动更新它们以保持它们同步),并且每一个也会 减慢编译速度 ,因为 TypeScript 必须花时间来验证注释是正确。

作为@typescript-eslint的维护者,我强烈建议反对使用typedef 规则。