prefer-destructuring
Требовать деструктуризацию из массивов и/или объектов
Некоторые проблемы, обнаруженные этой настройкой, автоматически исправляются опцией --fix командной строки
С JavaScript ES6 была добавлена новая синтаксическая конструкция для создания переменных из индексов массива или свойств объекта, называемая деструктуризацией. Эта настройка навязывает использование деструктуризации вместо доступа к свойству через выражение члена.
Подробное описание правила
Параметры
Эта настройка принимает два аргумента, оба из которых являются объектами. Первый параметр-объект определяет, к каким типам деструктуризации применяется правило.
В первом объекте есть два свойства, array и object, которые могут быть использованы для включения или отключения требования деструктуризации для каждого из этих типов независимо. По умолчанию оба установлены в true.
{
"rules": {
"prefer-destructuring": ["error", {
"array": true,
"object": true
}]
}
}
Например, следующая конфигурация навязывает только деструктуризацию объектов, но не деструктуризацию массивов:
{
"rules": {
"prefer-destructuring": ["error", {"object": true, "array": false}]
}
}
Примеры неправильного кода для этой настройки:
/* eslint prefer-destructuring: "error" */
// With `array` enabled
var ;
;
// With `object` enabled
var ;
var ;
Примеры правильного кода для этой настройки:
/* 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 навязана:
/* eslint prefer-destructuring: ["error", {VariableDeclarator: {object: true}}] */
var {bar: foo} = object;
Примеры правильного кода, когда деструктуризация массивов в AssignmentExpression навязана:
/* eslint prefer-destructuring: ["error", {AssignmentExpression: {array: true}}] */
[bar] = array;
enforceForRenamedProperties
У правила есть второй параметр-объект с одним ключом, enforceForRenamedProperties, который определяет, применяется ли деструктуризация object к переименованным переменным.
{
"rules": {
"prefer-destructuring": ["error",
{
"object": true
},
{
"enforceForRenamedProperties": true
}]
}
}
Примеры неправильного кода, когда enforceForRenamedProperties включено:
/* eslint "prefer-destructuring": ["error", { "object": true }, { "enforceForRenamedProperties": true }] */
var ;
Примеры правильного кода, когда enforceForRenamedProperties включено:
/* eslint "prefer-destructuring": ["error", { "object": true }, { "enforceForRenamedProperties": true }] */
var { bar: foo } = object;
Примеры дополнительного правильного кода, когда enforceForRenamedProperties включено:
/* 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.
Дополнительные материалы для чтения
Ссылки
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/prefer-destructuring