Как использовать 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)
})

Другие вопросы по тегам