为了账号安全,请及时绑定邮箱和手机立即绑定

在ES6 / Typescript中将_(下划线)变量与箭头函数一起使用

在ES6 / Typescript中将_(下划线)变量与箭头函数一起使用

料青山看我应如是 2019-12-12 14:10:10
我在一个Angular示例中遇到了这个构造,我想知道为什么选择了这个构造:_ => 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());}
查看完整描述

3 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

之所以可以使用此样式(可能是在此处使用该样式)的原因_是比短一个字符()。


可选括号与可选大括号属于同一样式问题。这在很大程度上取决于品味和代码风格,但由于一致性,在这里倾向于冗长。


尽管箭头函数允许单个参数不带括号,但它与零,单个解构,单个休止符和多个参数不一致:


let zeroParamFn = () => { ... };

let oneParamFn = param1 => { ... };

let oneParamDestructuredArrFn = ([param1]) => { ... };

let oneParamDestructuredObjFn = ({ param1 }) => { ... };

let twoParamsFn = (param1, param2) => { ... };

let restParamsFn = (...params) => { ... };

尽管is declared but never used错误固定在打字稿2.0为下划线的参数,_也可以触发unused variable/parameter从棉绒或IDE警告。这是反对这样做的一个相当大的理由。


_通常可以用于忽略的参数(如已经解释的其他答案)。尽管这可能被接受,但是这种习惯可能会导致与_Underscore / Lodash命名空间发生冲突,并且在存在多个被忽略的参数时也会令人困惑。因此,正确命名带下划线的参数(在TS 2.0中受支持)是有益的,还节省了找出函数签名的时间以及为什么将这些参数标记为忽略的原因(这违背了将_参数作为快捷方式的目的):


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

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



查看完整回答
反对 回复 2019-12-13
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

该()语法传达的意图更好恕我直言,也是更具体的类型


不完全是。()表示该函数不包含任何参数,不声明任何参数。该函数.length为0。


如果使用_,它将明确声明该函数将被传递一个参数,但您对此并不在意。该函数的.length值为1,这在某些框架中可能很重要。


因此,从类型的角度来看,这可能是更准确的操作(尤其是当您不使用any而是键入时_: Event)。正如您所说,键入的字符减少了一个字符,在某些键盘上也更容易触及。



查看完整回答
反对 回复 2019-12-13
?
青春有我

TA贡献1784条经验 获得超8个赞

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


这样的区分看起来像下面的例子:


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)



查看完整回答
反对 回复 2019-12-13
  • 3 回答
  • 0 关注
  • 354 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号