Skip to main content

How to Resolve the "Expected parentheses around arrow function argument (arrow-parens)" ESLint Rule Warning in javaScript

When writing arrow functions in JavaScript, you may encounter the ESLint warning Expected parentheses around arrow function argument (arrow-parens). This is a stylistic rule designed to enforce consistency in your codebase, not an error in your code's logic.

This guide will explain what the arrow-parens rule does, show you the two primary styles it can enforce ("always" vs. "as-needed"), and teach you how to configure it to match your project's coding standards.

Understanding the arrow-parens Rule

In JavaScript, the parentheses around the argument of an arrow function are optional only if there is exactly one argument.

// These two functions are syntactically identical
const funcA = x => x + 1;
const funcB = (x) => x + 1;

// Parentheses are REQUIRED for zero, two, or more arguments
const funcC = () => 'Hello';
const funcD = (a, b) => a + b;

The arrow-parens ESLint rule exists to enforce a consistent style for the single-argument case, preventing developers from mixing both styles in the same project.

Option 1: "always" - Always Use Parentheses (The Default)

By default, ESLint sets this rule to "always". This means it requires parentheses around the argument in all cases, eliminating the exception for single-argument functions.

For example, this code triggers the warning because the num parameter is not wrapped in parentheses.

// ⛔️ Expected parentheses around arrow function argument. (arrow-parens)
const increment = num => {
return num + 1;
};

To fix the warning, simply add the parentheses.

// ✅ No ESLint warning
const increment = (num) => {
return num + 1;
};
note

This style is often preferred for its consistency. It also has the advantage of making code modifications easier; if you need to add a second argument or a type annotation (in TypeScript), the parentheses are already there.

Option 2: "as-needed" - Use Parentheses Only When Required

Many developers prefer a more minimal style, omitting parentheses wherever they are not syntactically required. You can configure ESLint to enforce this by setting the arrow-parens rule to "as-needed".

With this rule, the original "problematic" code is now the only correct style for a single argument.

// ✅ No warnings with "as-needed"
const increment = num => {
return num + 1;
};

In fact, with this setting, adding unnecessary parentheses will now cause an ESLint error.

// ⛔️ Unexpected parentheses around arrow function argument. (arrow-parens)
const increment = (num) => {
return num + 1;
};

How to Configure the Rule in Your .eslintrc File

You can easily configure this rule for your entire project in your ESLint configuration file.

note

Choose only one of these options to set your project's standard.

.eslintrc.js
module.exports = {
rules: {
// To enforce using parentheses always (the default)
'arrow-parens': ['error', 'always'],

// OR: to enforce using parentheses only when needed
'arrow-parens': ['error', 'as-needed'],

// OR: to completely disable the rule
'arrow-parens': 'off',
},
};

Conclusion: Which Style Should You Choose?

The choice between "always" and "as-needed" is purely a matter of personal or team preference. The most important thing is to choose one and be consistent.

  • "always" (the default) is a great choice for consistency and is often considered a safer default. It simplifies code reviews and makes adding/removing arguments or types less disruptive.
  • "as-needed" is preferred by those who favor a more minimal and concise coding style.

Whichever you choose, configuring it in your project's .eslintrc file will ensure your entire codebase follows the same convention.