Использование переменной (подчеркивание) с функциями стрелки в ES6/Typescript

я наткнулся на эту конструкцию в угловом примере, и мне интересно, почему это выбрано:

_ => console.log('Not using any parameters');

Я понимаю, что переменная _ означает не заботится/не используется, но поскольку это единственная переменная, есть ли причина предпочесть использование _ over:

() => console.log('Not using any parameters');

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

(_: any) => console.log('Not using any parameters');

если это имеет значение, это был контекст, в котором он использовался:

submit(query: string): void {
    this.router.navigate(['search'], { queryParams: { query: query } })
      .then(_ => this.search());
}

4 ответов


причина, по которой этот стиль можно использовать (и, возможно, почему он был использован здесь), заключается в том, что _ на один символ короче, чем ().

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

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

let zeroParamFn = () => { ... };
let oneParamFn = param1 => { ... };
let oneParamDestructuredArrFn = ([param1]) => { ... };
let oneParamDestructuredObjFn = ({ param1 }) => { ... };
let twoParamsFn = (param1, param2) => { ... };
let restParamsFn = (...params) => { ... };

хотя is declared but never used исправлено в TypeScript 2.0 для параметров подчеркнул, _ также может вызвать unused variable/parameter предупреждение от linter или IDE. Это серьезный аргумент против этого.

_ можно условно использовать для игнорируемых параметров (как уже объяснен другой ответ). Хотя это может считаться приемлемым, эта привычка может привести к конфликту с _ пространство имен подчеркивания / Lodash также выглядит запутанным, когда есть несколько игнорируемых параметров. По этой причине полезно иметь правильно названные подчеркнутые параметры (поддерживаемые в TS 2.0), а также экономит время на выяснении сигнатуры функции и почему параметры помечены как игнорируемые (это противоречит цели _ параметр как ярлык):

let fn = (param1, _unusedParam2, param3) => { ... };

по причинам, перечисленным выше, я лично считаю _ => { ... } стиль кода плохой тон, который должен быть избежавший.


The () синтаксис передает намерение лучше imho, а также более специфичный для типа

не совсем. () говорит, что функция не ожидает никаких аргументов, она не объявляет никаких параметров. Функция .length равен 0.

если вы используете _, он явно указывает, что функция будет передана один аргумент, но что вам все равно. Функция .length будет 1, что может иметь значение в некоторых рамках.

таким образом, с точки зрения типа, это может быть более точной вещью (особенно, когда вы не печатаете его с any но, скажем, _: Event). И, как вы сказали, это на один символ меньше для ввода, который также легче достичь на некоторых клавиатурах.


Я думаю _ => просто используется над () =>, потому что _ распространен на других языках, где не разрешается просто опускать параметры, как в JS.

_ популярен в Go, и он также используется в Dart, чтобы указать, что параметр игнорируется и, вероятно, другие, о которых я не знаю.


можно различать два использования, и некоторые фреймворки используют это для представления различных типов обратных вызовов. Например, я думаю, что nodes express framework использует это для различения типов промежуточного программного обеспечения,например, обработчики ошибок используют три аргумента, а маршрутизация использует два.

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

const f1 = () => { } // A function taking no arguments
const f2 = _ => { }  // A function with one argument that doesn't use it

function h(ff) { 
  if(ff.length==0) {
    console.log("No argument function - calling directly");
    ff()
  } else if (ff.length==1) {
    console.log("Single argument function - calling with 1");
    ff(1)
  }
}

h(f1)
h(f2)