在 ES6/Type 脚本中使用带箭头函数的_(下划线)变量

我在一个角度的例子中遇到了这个结构,我想知道为什么选择这个:

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

我知道变量 _的意思是不在乎/不使用,但既然它是唯一的变量,那么有什么理由更喜欢使用 _而不是:

() => 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());
}
78901 次浏览

我想 _ =>只是在 () =>上使用,因为 _在其他语言中很常见,在这些语言中不允许像在 JS 中那样只省略参数。

_在 Go 中很流行,在 Dart 中也用它来表示一个参数被忽略,可能还有其他我不知道的参数。

()语法传达了更好的 imho 意图,也更具有类型特定性

不完全是。()表示该函数不期望任何参数,它不声明任何参数。函数的 .length是0。

如果您使用 _,它显式地声明函数将被传递一个参数,但是您并不关心它。函数的 .length将是1,这在某些框架中可能很重要。

因此,从类型的角度来看,这样做可能更准确(特别是当您不使用 any而是使用 _: Event来输入它时)。正如你所说的,这是一个字符少输入,也更容易达到一些键盘。

之所以可以使用这种样式(可能也是这里使用它的原因) ,是因为 _()短一个字符。

可选括号与 可选的花括号属于同样的样式问题。在大多数情况下,这是一个品味和代码风格的问题,但是由于一致性,冗长性在这里更受欢迎。

虽然箭头函数允许单个参数不带括号,但它与零、单个解构、单个静止和多个参数不一致:

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警告从行程或 IDE。反对这样做的理由很充分。

_通常可用于忽略的参数(另一个答案已经解释过了)。虽然这可能被认为是可以接受的,但是这个习惯可能会导致与 _ Underscore/Lodash 名称空间的冲突,当存在多个被忽略的参数时,这个习惯看起来也很混乱。由于这个原因,正确命名下划线的参数(TS 2.0支持)是有益的,也节省了计算函数签名和为什么将参数标记为忽略的时间(这违背了 _参数作为快捷方式的目的) :

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

由于上面列出的原因,我个人认为 _ => { ... }代码风格是一个应该避免的不好的基调。

可以区分这两种用法,一些框架使用它来表示不同类型的回调。例如,我认为节点表示框架使用它来区分中间件的类型,例如,错误处理程序使用三个参数,而路由使用两个参数。

这种差异可以看作下面的例子:

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);

这是基于 Bergi 的回答,但我认为添加一个例子比我乐意对其他人的帖子做更多的编辑。