Spec-Zone.ru › ESLint

prefer-destructuring

Требовать деструктуризацию из массивов и/или объектов

🔧 Fixable

Некоторые проблемы, обнаруженные этой настройкой, автоматически исправляются опцией --fix командной строки

С JavaScript ES6 была добавлена новая синтаксическая конструкция для создания переменных из индексов массива или свойств объекта, называемая деструктуризацией. Эта настройка навязывает использование деструктуризации вместо доступа к свойству через выражение члена.

Подробное описание правила

Параметры

Эта настройка принимает два аргумента, оба из которых являются объектами. Первый параметр-объект определяет, к каким типам деструктуризации применяется правило.

В первом объекте есть два свойства, array и object, которые могут быть использованы для включения или отключения требования деструктуризации для каждого из этих типов независимо. По умолчанию оба установлены в true.

{
  "rules": {
    "prefer-destructuring": ["error", {
      "array": true,
      "object": true
    }]
  }
}

Например, следующая конфигурация навязывает только деструктуризацию объектов, но не деструктуризацию массивов:

{
  "rules": {
    "prefer-destructuring": ["error", {"object": true, "array": false}]
  }
}

Примеры неправильного кода для этой настройки:

Открыть в Playground
/* eslint prefer-destructuring: "error" */

// With `array` enabled
var foo = array[0];
bar.baz = array[0];

// With `object` enabled
var foo = object.foo;
var foo = object['foo'];

Примеры правильного кода для этой настройки:

Открыть в Playground
/* eslint prefer-destructuring: "error" */

// With `array` enabled
var [ foo ] = array;
var foo = array[someIndex];
[bar.baz] = array;


// With `object` enabled
var { foo } = object;

var foo = object.bar;

let bar;
({ bar } = object);

В качестве альтернативы можно использовать отдельные конфигурации для разных типов присваивания. Первый аргумент принимает два других ключа вместо array и object.

Один ключ — VariableDeclarator, а другой — AssignmentExpression, которые можно использовать для управления требованием деструктуризации для каждого из этих типов независимо. Каждое свойство является объектом, содержащим два свойства, array и object, которые могут быть использованы для управления требованием деструктуризации для каждого из array и object независимо для объявлений переменных и выражений присваивания. По умолчанию array и object установлены в true для VariableDeclarator и AssignmentExpression.

{
  "rules": {
    "prefer-destructuring": ["error", {
      "VariableDeclarator": {
        "array": true,
        "object": true
      },
      "AssignmentExpression": {
        "array": true,
        "object": true
      }
    }]
  }
}

Примеры правильного кода, когда деструктуризация объектов в VariableDeclarator навязана:

Открыть в Playground
/* eslint prefer-destructuring: ["error", {VariableDeclarator: {object: true}}] */
var {bar: foo} = object;

Примеры правильного кода, когда деструктуризация массивов в AssignmentExpression навязана:

Открыть в Playground
/* eslint prefer-destructuring: ["error", {AssignmentExpression: {array: true}}] */
[bar] = array;

enforceForRenamedProperties

У правила есть второй параметр-объект с одним ключом, enforceForRenamedProperties, который определяет, применяется ли деструктуризация object к переименованным переменным.

{
  "rules": {
    "prefer-destructuring": ["error",
    {
      "object": true
    },
    {
      "enforceForRenamedProperties": true
    }]
  }
}

Примеры неправильного кода, когда enforceForRenamedProperties включено:

Открыть в Playground
/* eslint "prefer-destructuring": ["error", { "object": true }, { "enforceForRenamedProperties": true }] */
var foo = object.bar;

Примеры правильного кода, когда enforceForRenamedProperties включено:

Открыть в Playground
/* eslint "prefer-destructuring": ["error", { "object": true }, { "enforceForRenamedProperties": true }] */
var { bar: foo } = object;

Примеры дополнительного правильного кода, когда enforceForRenamedProperties включено:

Открыть в Playground
/* eslint "prefer-destructuring": ["error", { "object": true }, { "enforceForRenamedProperties": true }] */
class C {
    #x;
    foo() {
        const bar = this.#x; // private identifiers are not allowed in destructuring
    }
}

Примечание: Нет возможности определить, будет ли переменная ссылаться на объект или массив во время выполнения. Поэтому эта настройка угадывает тип присваивания, проверяя, является ли доступный ключ целым числом. Это может привести к следующим, возможно, запутывающим ситуациям:

  • Доступ к свойству объекта, ключ которого является целым числом, будет относиться к категории array деструктуризации.
  • Доступ к элементу массива через вычисленный индекс будет относиться к категории object деструктуризации.

Опция --fix в командной строке исправляет только проблемы, обнаруженные в объявлениях переменных, и только те из них, которые относятся к категории object деструктуризации. Кроме того, имя объявленной переменной должно совпадать с именем, используемым для доступа к члену без вычислений в инициализаторе. Например, var foo = object.foo может быть автоматически исправлен этим правилом. Проблемы, связанные с вычислением доступа к членам (например, var foo = object[foo]) или переименованными свойствами (например, var foo = object.bar) не исправляются автоматически.

Когда не следует использовать её

Если вам нужно получить прямой доступ к индексам массивов или свойствам объектов, можно настроить правило на свой вкус или отключить его полностью.

Кроме того, если вы планируете получить прямой доступ к большим индексам массивов, например:

var foo = array[100];

Тогда часть array этого правила не рекомендуется, так как деструктуризация не очень хорошо соответствует этому случаю.

Или для не-итерируемых объектов «подобных массивам»:

var $ = require('jquery');
var foo = $('body')[0];
var [bar] = $('body'); // fails with a TypeError

Версия

Это правило было введено в ESLint v3.13.0.

Дополнительные материалы для чтения

Деструктурирующее присваивание - JavaScript | MDN
Деструктуризация и обработка параметров в ECMAScript 6

Ссылки

  • Исходный код правила
  • Тесты

© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/prefer-destructuring

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API