Я использую определения типизации (DefinitelyTyped) для bluebird, и у меня возникла проблема с Promise.attempt<T>
.
Я не понимаю, зачем мне нужно следующее приведение: https://github.com/brandf/upstream/blob/0b38a42a/src/domain.ts#L73
return Promise.attempt<Data>(() => {
return <Data>handler(matchResult, id);
});
Обратите внимание, что тип обработчика возвращает Data|Promise<Data>
. Без приведения возвращаемого значения к <Data>
я получаю следующую ошибку:
src/domain.ts(72,50): error TS2345: Argument of type '() => Data |
Promise<Data>' is not assignable to parameter of type '() => Data'.
Type 'Data | Promise<Data>' is not assignable to type 'Data'.
Type 'Promise<Data>' is not assignable to type 'Data'.
Это имело бы смысл, если бы сигнатура для попытки принимала только функцию, возвращающую данные, но есть две перегрузки.
https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/bluebird/bluebird.d.ts#L57-L58
attempt<T>(fn: () => PromiseLike<T>, args?: any[], ctx?: any): Promise<T>;
attempt<T>(fn: () => T, args?: any[], ctx?: any): Promise<T>;
Я ожидаю, что Typescript увидит обе перегрузки и распознает, что () => Data|Promise<Data>
совпадает с () => Data
плюс () => Promise<Data>
, но, похоже, это не так.
Я что-то упускаю? Является ли это ограничением Typescript или просто плохими определениями типов?
Я могу изменить определения типа bluebird, чтобы иметь одну перегрузку, которая занимает () => T|Promise<T>
, тогда мне не нужно приведение, но я все же хотел бы понять, почему это необходимо, учитывая существующие перегрузки.