如何在胖箭头承诺链中声明类型?

时间:2016-09-23 15:52:22

标签: typescript ecmascript-6 es6-promise

我对TypeScript语法很陌生。使用这样的现有代码:

private checkUsername(username: FormControl): boolean {
  return this.userService
    .findUser(username.value)
    .catch(error => this.displayError(error));
}

TypeScript linter警告参数error隐含属于any 类型。很公平,但当我尝试在胖箭头中添加我认为类型声明的内容时:

.catch(error:any => this.displayError(error));

linter警告它需要,代替:

我可以通过在括号中包装参数和类型声明来平息错误:

.catch((error:any) => this.displayError(error));

这是因为它期望使用前一种语法的速记参数列表(因此在以这种方式声明类型信息时必须使用括号)?

What's the meaning of "=>" in TypeScript? (Fat Arrow)What's the meaning of "=>" (an arrow formed from equals & greater than) in JavaScript?都不是特别有用。)

3 个答案:

答案 0 :(得分:4)

您可以在TypeScript中使用其中任何一个:

.catch(error => this.displayError(error));

.catch((error: any) => this.displayError(error));

然而,这是无效的:

.catch(error: any => this.displayError(error));

这只是TypeScript语法规则。

但是,您尝试做的事情有简写:

.catch(this.displayError);

更简单!

答案 1 :(得分:1)

您的语法正确。

在ES6中,这两个箭头函数是等价的,相同;

.catch(error => this.displayError(error));

.catch((error) => this.displayError(error));

第一个是速记,只有在您拥有exaclty ONE 参数时才允许使用。

使用TypeScript,如果要添加类型修饰,则必须使用带括号的第二个表单。

答案 2 :(得分:1)

您需要将name:type对包装在parens中,否则解析器不知道如何处理它。这并非常不寻常,因为当箭头函数有多个参数或比foo => bar更复杂的任何参数时,箭头函数也需要parens。

由于foo : bar语法可以显示在其他一些地方(三元组,对象文字和标签),因此消除歧义尤为重要。