TL; DR: Ваш первый пример верен.
1
getUserList(): Promise<User[]> {
return userService.getList();
}
Этот метод я бы использовал.Поскольку вы не используете await
в теле метода и предполагаете, что getList()
возвращает обещание, нет необходимости объявлять метод async
.
2
async getUserList(): Promise<User[]> {
return userService.getList();
}
Все async
методы неявно возвращают Promise
.Рассмотрим следующее:
async getNumber() {
return 1;
}
Это на самом деле возвращает Promise<number>
.По этой причине ваш пример № 2 аннотирован неправильно и из трех примеров является единственным функционально некорректным.На самом деле, так выглядит подпись типа с учетом того, что она делает:
async getUserList(): Promise<Promise<User[]>>
Редактировать: В соответствии это , если объект обещания возвращается async
метод, он не переупакован в обещание, поэтому этот пример может быть похож на # 3 в том, что его объявление async
все еще функционально корректно, хотя и ненужно и запутанно.
3
async getUserList(): Promise<User[]> {
return await userService.getList();
}
Это просто избыточно.Вы await
получаете результат обещания, а затем неявно перематываете его в обещание перед его возвратом.Это действительно было бы полезно, если бы вы await
использовали больше вещей в теле функции, например:
async getUserList(): Promise<User[]> {
const someRequiredValue = await userService.someOtherThing();
return await userService.getList(someRequiredValue);
}