Могу ли я отключить правило eslint tyfedef для деструктуризации в лямбдах

Мне интересно, можно ли отключить правило 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, но это совершенно не помогло.

Документация по этому правилу, которое я использовал: @ 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"
        ]
    }
}

person Krzysztof Kaczyński    schedule 02.10.2020    source источник
comment
Почему вы хотите принудительно использовать ненужные аннотации типов?   -  person T.J. Crowder    schedule 02.10.2020
comment
@ T.J.Crowder Это требование в этом проекте и рабочем процессе команды: /   -  person Krzysztof Kaczyński    schedule 02.10.2020
comment
Это прискорбно. :-)   -  person T.J. Crowder    schedule 02.10.2020
comment
к сожалению да: ')   -  person Krzysztof Kaczyński    schedule 02.10.2020
comment
@ T.J.Crowder Я создал репозиторий с минимальным кодом, необходимым для воспроизведения   -  person Krzysztof Kaczyński    schedule 02.10.2020
comment
Я скопировал содержимое этих файлов в вопрос. Весь вопрос (включая любой необходимый код) должен быть в вопросе, а не просто связан. Три причины: люди не должны выезжать за пределы предприятия, чтобы помочь вам; некоторые сайты заблокированы для некоторых пользователей; и ссылки гниют, делая вопрос и ответы на него бесполезными для людей в будущем.   -  person T.J. Crowder    schedule 02.10.2020
comment
@ T.J. Crowder Хорошо, я понимаю   -  person Krzysztof Kaczyński    schedule 02.10.2020


Ответы (1)


Правило не поддерживает это - оно рассматривает все деструктурирование как одно и то же.
Обратите внимание, что дополнительные возможности настройки не будут добавлены к правилу, потому что его не следует использовать в большинстве кодовых баз.

Его использование и добавление ненужных аннотаций типов - это антипаттерн, который отрицательно сказывается на вашей кодовой базе.


На самом деле это правило не предназначено для повседневного использования в базе кода, оно предназначено для помощи в переносе базы кода, чтобы вы могли включить параметр компилятора noImplicitAny.

Повсюду ненужные аннотации типов вредны для вашей кодовой базы. Каждый из них требует затрат на обслуживание (вы должны вручную обновлять их, чтобы поддерживать их синхронизацию), и каждый также замедляет компиляцию, потому что TypeScript требуется время, чтобы проверить правильность аннотации.

Как сопровождающий @typescript-eslint, я настоятельно не рекомендую использовать правило typedef.

person Brad Zacher    schedule 03.10.2020
comment
Очень хорошо сказано. Кроме того, ненужные аннотации типов могут действовать как утверждения скрытого типа (т.е. let xs: any[] = [{}]; xs.map((x: string) => x.toUpperCase()) // terrible!) - person Aluan Haddad; 03.10.2020
comment
Хм, я не знал, что это повлияет на процесс компиляции (приятный улов). Очень хороший ответ. Спасибо тебе, друг - person Krzysztof Kaczyński; 03.10.2020