Как использовать Bluebird в Typescript 2.1+
(Я прочитал этот пост, но это с августа, и он не отвечает на мой вопрос для текущей версии машинописного текста.)
В настоящее время я использую Typescript 1.8 в своем проекте, и это прекрасно работает:
import * as Promise from "bluebird";
async function f() : Promise<void> {
return Promise.delay(200);
}
Но если я попытаюсь скомпилировать с Typescript 2.1:
index.ts(2,16): error TS1059: Return expression in async function does not have a valid callable 'then' member.
Погугливая проблему использования Bluebird Promises в Typscript, я также обнаружил множество обсуждений, комментариев и PR на github, но их все очень трудно понять, и при обсуждении интересных моментов я не могу найти нигде, где говорится, как я должен заставить это работать сейчас.
Итак, как я могу использовать Bluebird для Promises в Typescript 2.1?
3 ответа
Рассмотреть возможность использования @types/bluebird-global
следующее.
npm install --save-dev @types/bluebird-global
Импортируйте это один раз в вашу основную точку входа.
// The same Promise API, everywhere.
import * as Promise from 'bluebird'
global.Promise = Promise
См. DefinitiveTyped выпуск #11027 для дальнейшего контекста.
Я задал тот же вопрос здесь: https://github.com/Microsoft/TypeScript/issues/8331
В конце концов мой собственный ответ сработал. Вот как использовать его в TypeScript 2.3 без дополнительного .d.ts
файл:
import * as Bluebird from 'bluebird';
export interface DummyConstructor extends Bluebird<any> {
new<T>(): Bluebird<T>;
}
declare global {
interface Promise<T> extends Bluebird<T> {
then(...args: any[]): any;
catch(...args: any[]): any;
}
interface PromiseConstructor extends DummyConstructor {}
var Promise: Promise<any>;
}
Promise = Bluebird as any;
async function test() {
console.log('PING');
await Promise.delay(1000);
console.log('PONG');
}
test();
Это ужасно и не сработает в будущем при нацеливании на родную ES7, потому что в будущем async
/ await
просто не вернет обещания Bluebird, и с этим ничего не поделаешь. Однако до тех пор и при переносе на ES5 это будет работать.
Несмотря на множественность any
типы, это кажется несколько типобезопасным. Я уверен, что это может быть улучшено.
Для общего обзора, посмотрите на страницу документации SO Например. для bluebird вы можете просто набрать bluebird. Этот код прекрасно компилируется для меня:
import Promise = require('bluebird')
Promise.resolve("foo").then(function (msg) {
console.log(msg)
})