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

Hal*_*alt 98 javascript typescript ecmascript-6 arrow-functions

我在一个Angular示例中遇到了这个构造,我想知道为什么选择它:

_ => console.log('Not using any parameters');
Run Code Online (Sandbox Code Playgroud)

我理解变量_意味着不关心/不使用但因为它是唯一的变量是有任何理由更喜欢使用_ over:

() => console.log('Not using any parameters');
Run Code Online (Sandbox Code Playgroud)

当然,这不能是一个字符少于键入.()语法在我看来更好地传达了intent,并且更具特定类型,因为否则我认为第一个示例应该是这样的:

(_: any) => console.log('Not using any parameters');
Run Code Online (Sandbox Code Playgroud)

如果重要,这就是使用它的背景:

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

Est*_*ask 78

可以使用这种风格的原因(也可能是为什么在这里使用它)是_比一个字符更短的一个字符().

可选括号与可选花括号属于同一样式问题.这在很大程度上是品味和代码风格的问题,但由于一致性,冗长在这里受到青睐.

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

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

尽管在TypeScript 2.0中针对下划线参数修复了is declared but never used错误,但也可以从linter或IDE 触发警告.这是反对这样做的一个相当大的争论._unused variable/parameter

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

let fn = (param1, _unusedParam2, param3) => { ... };
Run Code Online (Sandbox Code Playgroud)

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

  • @Mojimi,您可能必须按“)”或右箭头键才能跳过该字符。 (2认同)

Ber*_*rgi 59

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

不完全是.()说该函数不期望任何参数,它不会声明任何参数.函数.length为0.

如果你使用_,它明确声明该函数将传递一个参数,但你不关心它.函数.length将为1,这在某些框架中可能很重要.

所以从类型的角度来看,它可能是更准确的事情(特别是当你不打字any但是,比方说_: Event).正如你所说,键入的字符少一个,在某些键盘上也更容易触及.

  • 我的第一个想法是_只是按照惯例明白,在尝试理解函数时没有任何参数要考虑.使用()使其显式,不需要扫描代码以便可能使用_(这会违反约定).但是你睁开眼睛还要考虑记录传递给函数的值的价值,否则这些值并不总是很明显. (6认同)

Gün*_*uer 23

我猜_ =>它只是用过,() =>因为_在其他语言中很常见,不允许只省略JS中的参数.

_ 在Go中很受欢迎,它也用于Dart表示参数被忽略,可能还有其他我不知道的参数.

  • 这个`_`的用法大概是从函数语言中借用的,例如ML和Haskell,它早于Python的发明(更不用说Go,Dart或TypeScript)了. (7认同)
  • 我认为Python也遵循这个惯例. (3认同)

Mic*_*son 10

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

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

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)
Run Code Online (Sandbox Code Playgroud)