在ES6 / Typescript中使用_(下划线)variables和箭头函数

我以一个angular度的例子来看这个构造,我想知道为什么select这个:

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

我明白,variables_手段不关心/不使用,但因为它是唯一的variables是有什么理由更喜欢使用_ over:

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

当然这不能less于一个字符的types。 ()语法更好地传达了我的意图,也是更具体的types,否则我认为第一个例子应该是这样的:

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

如果重要的话,这就是它的使用环境:

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

这个样式可以被使用的原因(也可能是为什么在这里使用)是_是比()短的一个字符。

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

虽然箭头函数允许没有括号的单个参数,但它与零,单个解构,单rest和多个参数不一致:

 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中修复了强调的参数, _还可以触发来自linter或IDE的unused variable/parameter警告。 这是一个相当大的反对这样做的论点。

_可以按惯例用于忽略的参数(如已经解释的其他答案)。 虽然这可能被认为是可以接受的,但是这种习惯可能会导致与_Underscore / Lodash命名空间的冲突,当有多个被忽略的参数时,也会看起来很混乱。 出于这个原因,正确命名下划线的参数(在TS 2.0中支持)是有益的,同时也节省了计算函数签名的时间,以及为什么参数被标记为忽​​略(这违背了_参数的目的作为快捷方式):

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

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

()语法更好地传达了意图imho,也是更具体的types

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

如果使用_ ,则明确指出该函数将传递一个参数,但您不关心它。 函数的.length将是1,这在一些框架中可能很重要。

所以从types的angular度来看,这可能是更准确的事情(尤其是当你没有inputany ,比如_: Event )。 正如你所说,这是一个字符less键入,这也更容易达到一些键盘。

我猜_ =>只是用于over () =>因为_在其他语言中是通用的,在这种语言中,不允许像JS一样忽略参数。

_在Go中很受欢迎,在Dart中它也被用来表示一个参数被忽略,而其他的我可能不知道。

区分两种用法是可能的,一些框架使用它来表示不同types的callback。 例如,我认为节点expression框架使用这个来区分中间件的types,例如error handling程序使用三个参数,而路由使用两个参数。

这种差异可以看起来像下面的例子:

 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)