【问题标题】:How to declare types in a fat arrow promise chain?如何在胖箭头承诺链中声明类型?
【发布时间】:2016-09-23 15:52:21
【问题描述】:

我对 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? 都不是特别有用。)

【问题讨论】:

  • 这与 promise 没有任何关系,不是吗?我不确定为什么它的标题中有标签或单词...
  • @MikeMcCaughan 因为我以前没有这样做过,我不确定它是否与它在承诺链中有关。如果没有,这是有用的信息。谢谢。

标签: typescript ecmascript-6 es6-promise


【解决方案1】:

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

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

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

但是,这是无效的:

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

这只是 TypeScript 语法规则。

不过,您正在尝试做的事情有一个简写:

.catch(this.displayError);

简单多了!

【讨论】:

  • 当然,我怎么没想到呢!我产生了一种在任何地方都添加类型的想法,即使它们显然仍会被最后一种方法捕获。
  • 请注意,速记是不完整的,如果displayError 引用this 会中断。那你需要.catch(this.displayError.bind(this))
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    你有正确的语法。

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

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

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

    第一个是简写,只有当你有精确的 ONE 参数时才允许使用。

    使用 TypeScript,如果您要添加类型修饰 - 您必须使用带括号的第二种形式。

    【讨论】:

    • 多年后,我仍然有一半的 cmets 在 Stack Overflow 上向人们提及这一点。
    猜你喜欢
    • 2021-06-23
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 2017-08-26
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多