Как объявить типы в цепочке обещаний жирной стрелки?

Я совершенно новичок в синтаксисе TypeScript. Работаем над существующим кодом следующим образом:

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

линтер TypeScript предупреждает, что параметр error неявно относится к типу any. Достаточно справедливо, но когда я пытаюсь добавить то, что я думаю, выглядит как объявление типа внутри жирной стрелки:

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

линтер предупреждает, что ожидает , вместо :.

Я могу подавить ошибку, заключив объявление параметра и типа в круглые скобки:

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

Это потому, что он ожидает сокращенный список параметров с прежним синтаксисом (поэтому круглые скобки будут обязательными при объявлении информации о типе таким образом)?

(Ни Что означает =› в TypeScript? (Fat Arrow) ни Что значение =› (стрелка, состоящая из знаков «равно» и «больше») в JavaScript? были особенно полезны.)


person msanford    schedule 23.09.2016    source источник
comment
Это на самом деле не имеет ничего общего с обещаниями, не так ли? Я не уверен, почему у него есть тег или слово в названии...   -  person Heretic Monkey    schedule 23.09.2016
comment
@MikeMcCaughan Поскольку я не делал этого раньше, я не знаю наверняка, связано ли это с тем, что оно находится в цепочке обещаний. Если нет, то это полезная информация. Спасибо.   -  person msanford    schedule 23.09.2016


Ответы (3)


Вы можете использовать любой из них в TypeScript:

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

or

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

Однако это неверно:

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

Это просто правила синтаксиса TypeScript.

Однако есть сокращение для того, что вы пытаетесь сделать:

.catch(this.displayError);

Гораздо проще!

person James Monger    schedule 23.09.2016
comment
Конечно, почему я не подумал об этом! Я пришел к мысли добавлять типы ко всему и везде, даже если они все равно будут захвачены с помощью последнего метода. - person msanford; 23.09.2016
comment
Обратите внимание, что стенография неполная и сломается, если displayError ссылается на this. Тогда вам нужно .catch(this.displayError.bind(this)) - person artem; 24.09.2016

Вам нужно заключить пару name:type в круглые скобки, иначе синтаксический анализатор не знает, что с ней делать. В этом нет ничего необычного, так как стрелочные функции также требуют круглых скобок, когда они имеют более одного параметра или что-то более сложное, чем просто foo => bar.

Поскольку синтаксис foo : bar может проявляться в нескольких других местах (тернарах, литералах объектов и метках), это особенно важно для устранения неоднозначности.

person ssube    schedule 23.09.2016

У вас правильный синтаксис.

В ES6 эти две стрелочные функции эквивалентны, одинаковы;

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

и

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

Первый — это сокращение, которое разрешено только в том случае, если у вас есть точно ОДИН параметр.

С TypeScript, если вы добавляете оформление шрифта — вы должны использовать вторую форму со скобками.

person Martin    schedule 23.09.2016
comment
Спустя годы я все еще трачу половину своих комментариев на Stack Overflow, упоминая об этом людям. - person msanford; 23.03.2018