Использование переменной (подчеркивание) с функциями стрелки в 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)