在 ES6/Typescript 中使用带有箭头函数的 _(下划线)变量
Using _ (underscore) variable with arrow functions in ES6/Typescript
我在 Angular 示例中遇到了这个结构,我想知道为什么选择它:
_ => console.log('Not using any parameters');
我知道变量 _
意味着不要 care/not 使用但是因为它是唯一的变量所以有任何理由更喜欢使用 _
而不是:
() => 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());
}
我想 _ =>
只是用在 () =>
上,因为 _
在其他语言中很常见,在其他语言中不允许像 JS 那样省略参数。
_
在 Go 中很流行,它也在 Dart 中用来表示一个参数被忽略,可能还有其他我不知道的参数。
The ()
syntax conveys the intent better imho and is also more type specific
不完全是。 ()
表示该函数不期望任何参数,它不声明任何参数。函数的.length
为0.
如果您使用 _
,它明确声明函数将传递一个参数,但您不关心它。函数的 .length
将为 1,这在某些框架中可能很重要。
因此,从类型的角度来看,这样做可能更准确(尤其是当您不使用 any
而是使用 _: Event
进行键入时)。正如您所说,输入的字符少了一个,在某些键盘上也更容易输入。
可以使用这种样式的原因(可能也是这里使用它的原因)是 _
比 ()
.
短一个字符
可选括号与 optional curly brackets 属于相同的样式问题。这在很大程度上是个人品味和代码风格的问题,但为了保持一致性,这里更倾向于冗长。
虽然箭头函数允许单参数不带括号,但与零、单解构、单剩余和多参数不一致:
let zeroParamFn = () => { ... };
let oneParamFn = param1 => { ... };
let oneParamDestructuredArrFn = ([param1]) => { ... };
let oneParamDestructuredObjFn = ({ param1 }) => { ... };
let twoParamsFn = (param1, param2) => { ... };
let restParamsFn = (...params) => { ... };
虽然带下划线的参数 is declared but never used
错误 was fixed in TypeScript 2.0,_
也可以从 linter 或 IDE 触发 unused variable/parameter
警告。这是反对这样做的一个相当大的论据。
_
通常可以用于忽略的参数(正如其他答案已经解释的那样)。虽然这可能被认为是可以接受的,但这种习惯可能会导致与 _
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 的回答,但我认为添加示例比我乐于对其他人所做的编辑要多一些 post。
我在 Angular 示例中遇到了这个结构,我想知道为什么选择它:
_ => console.log('Not using any parameters');
我知道变量 _
意味着不要 care/not 使用但是因为它是唯一的变量所以有任何理由更喜欢使用 _
而不是:
() => 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());
}
我想 _ =>
只是用在 () =>
上,因为 _
在其他语言中很常见,在其他语言中不允许像 JS 那样省略参数。
_
在 Go 中很流行,它也在 Dart 中用来表示一个参数被忽略,可能还有其他我不知道的参数。
The
()
syntax conveys the intent better imho and is also more type specific
不完全是。 ()
表示该函数不期望任何参数,它不声明任何参数。函数的.length
为0.
如果您使用 _
,它明确声明函数将传递一个参数,但您不关心它。函数的 .length
将为 1,这在某些框架中可能很重要。
因此,从类型的角度来看,这样做可能更准确(尤其是当您不使用 any
而是使用 _: Event
进行键入时)。正如您所说,输入的字符少了一个,在某些键盘上也更容易输入。
可以使用这种样式的原因(可能也是这里使用它的原因)是 _
比 ()
.
可选括号与 optional curly brackets 属于相同的样式问题。这在很大程度上是个人品味和代码风格的问题,但为了保持一致性,这里更倾向于冗长。
虽然箭头函数允许单参数不带括号,但与零、单解构、单剩余和多参数不一致:
let zeroParamFn = () => { ... };
let oneParamFn = param1 => { ... };
let oneParamDestructuredArrFn = ([param1]) => { ... };
let oneParamDestructuredObjFn = ({ param1 }) => { ... };
let twoParamsFn = (param1, param2) => { ... };
let restParamsFn = (...params) => { ... };
虽然带下划线的参数 is declared but never used
错误 was fixed in TypeScript 2.0,_
也可以从 linter 或 IDE 触发 unused variable/parameter
警告。这是反对这样做的一个相当大的论据。
_
通常可以用于忽略的参数(正如其他答案已经解释的那样)。虽然这可能被认为是可以接受的,但这种习惯可能会导致与 _
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 的回答,但我认为添加示例比我乐于对其他人所做的编辑要多一些 post。