Spec-Zone.ru › ESLint

func-style

Требует последовательного использования либо объявлений function, либо выражений, присвоенных переменным

❄️ Заморожено

В настоящее время это правило заморожено, и запросы на добавление новых функций не принимаются.

В JavaScript есть два способа определения функций: объявления function и функциональные выражения, присвоенные переменным. Объявления функций — это инструкции, начинающиеся с ключевого слова function. Функциональные выражения могут быть стрелочными функциями или использовать ключевое слово function с необязательным именем. Вот несколько примеров:

// function declaration
function doSomething() {
    // ...
}

// arrow function expression assigned to a variable
const doSomethingElse = () => {
    // ...
};

// function expression assigned to a variable
const doSomethingAgain = function() {
    // ...
};

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

doSomething(); // ok

function doSomething() {
    // ...
}

Для функциональных выражений необходимо определить функцию до её использования, иначе произойдёт ошибка. Пример:

doSomething();  // error!

const doSomething = function() {
    // ...
};

В этом случае во время вызова doSomething имеет значение undefined, поэтому возникает ошибка времени выполнения.

Из-за различий в поведении обычно устанавливают рекомендации относительно того, какой стиль функций следует использовать. Здесь нет единственно правильного или неправильного выбора — это лишь вопрос предпочтений.

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

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

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

Параметры

У этого правила есть строковый параметр:

  • "expression" (по умолчанию) требует использовать функциональные выражения вместо объявлений функций
  • "declaration" требует использовать объявления функций вместо функциональных выражений

У этого правила есть объектный параметр с двумя исключениями:

  • "allowArrowFunctions": true (по умолчанию false) разрешает использовать стрелочные функции. Этот параметр применяется только при значении строкового параметра "declaration" (стрелочные функции всегда разрешены, если строковый параметр имеет значение "expression", независимо от этого параметра)
  • "allowTypeAnnotation": true (по умолчанию false) разрешает использовать функциональные выражения и стрелочные функции, если объявление переменной содержит аннотацию типа, независимо от параметра allowArrowFunctions. Этот параметр применяется только при значении строкового параметра "declaration". (Только TypeScript)
  • "overrides":
    • "namedExports": "expression" | "declaration" | "ignore": переопределяет стили функций для именованных экспортов
      • "expression": как строковый параметр
      • "declaration": как строковый параметр
      • "ignore": допустим любой стиль

expression

Примеры неправильного кода для этого правила со значением параметра "expression" по умолчанию:

Открыть в Playground
/*eslint func-style: ["error", "expression"]*/

functionfoo(){// ...}

Примеры правильного кода для этого правила со значением параметра "expression" по умолчанию:

Открыть в Playground
/*eslint func-style: ["error", "expression"]*/

const foo = function() {
    // ...
};

const foo1 = () => {};

// allowed as allowArrowFunctions : false is applied only for declaration

Объявления перегруженных функций не считаются ошибками этим правилом. Это функции с несколькими объявлениями под одним именем, но с разными типами параметров или возвращаемыми значениями (обычно используются в TypeScript для предоставления информации о типах при разных способах вызова одной и той же функции).

Примеры правильного кода TypeScript для этого правила со значением параметра "expression" по умолчанию:

Открыть в Playground
/*eslint func-style: ["error", "expression"]*/

function process(value: string): string;
function process(value: number): number;
function process(value: unknown) {
    return value;
}

declaration

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

Открыть в Playground
/*eslint func-style: ["error", "declaration"]*/

const foo=function(){// ...};

const foo1 = () => {};

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

Открыть в Playground
/*eslint func-style: ["error", "declaration"]*/

function foo() {
    // ...
}

// Methods (functions assigned to objects) are not checked by this rule
SomeObject.foo = function() {
    // ...
};

allowArrowFunctions

Примеры дополнительного правильного кода для этого правила с параметрами "declaration", { "allowArrowFunctions": true }:

Открыть в Playground
/*eslint func-style: ["error", "declaration", { "allowArrowFunctions": true }]*/

const foo = () => {};

allowTypeAnnotation

Примеры неправильного кода TypeScript для этого правила с параметрами "declaration", { "allowTypeAnnotation": true }:

Открыть в Playground
/*eslint func-style: ["error", "declaration", { "allowTypeAnnotation": true }]*/

const foo = function(): void {};

Примеры правильного кода TypeScript для этого правила с параметрами "declaration", { "allowTypeAnnotation": true }:

Открыть в Playground
/*eslint func-style: ["error", "declaration", { "allowTypeAnnotation": true }]*/

type Fn = () => undefined;

const foo: Fn = function() {};

const bar: Fn = () => {};

overrides

namedExports

expression

Примеры неправильного кода для этого правила с параметрами "declaration" и {"overrides": { "namedExports": "expression" }}:

Открыть в Playground
/*eslint func-style: ["error", "declaration", { "overrides": { "namedExports": "expression" } }]*/

export functionfoo(){// ...}

Примеры правильного кода для этого правила с параметрами "declaration" и {"overrides": { "namedExports": "expression" }}:

Открыть в Playground
/*eslint func-style: ["error", "declaration", { "overrides": { "namedExports": "expression" } }]*/

export const foo = function() {
    // ...
};

export const bar = () => {};
declaration

Примеры неправильного кода для этого правила с параметрами "expression" и {"overrides": { "namedExports": "declaration" }}:

Открыть в Playground
/*eslint func-style: ["error", "expression", { "overrides": { "namedExports": "declaration" } }]*/

export const foo=function(){// ...};

export const bar = () => {};

Примеры правильного кода для этого правила с параметрами "expression" и {"overrides": { "namedExports": "declaration" }}:

Открыть в Playground
/*eslint func-style: ["error", "expression", { "overrides": { "namedExports": "declaration" } }]*/

export function foo() {
    // ...
}

Примеры правильного кода для этого правила с параметрами "expression" и { "allowTypeAnnotation": true, "overrides": { "namedExports": "declaration" }}:

Открыть в Playground
/*eslint func-style: ["error", "expression", { "allowTypeAnnotation": true, "overrides": { "namedExports": "declaration" } }]*/

export const foo: () => void = function () {}
ignore

Примеры правильного кода для этого правила с параметром {"overrides": { "namedExports": "ignore" }}:

Открыть в Playground
/*eslint func-style: ["error", "expression", { "overrides": { "namedExports": "ignore" } }]*/

export const foo = function() {
    // ...
};

export const bar = () => {};

export function baz() {
    // ...
}

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

Если вы хотите предоставить разработчикам возможность самостоятельно выбирать, как писать функции, это правило можно отключить.

Версия

Это правило появилось в ESLint v0.2.0.

Дополнительная литература

Области видимости и поднятие в JavaScript
www.adequatelygood.com

Ресурсы

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

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

Spec-Zone.ru

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