2016-12-28 19 views
5

(Czytałem this post ale jest od sierpnia i to nie jest odpowiedź na moje pytanie w obecnej wersji maszynopisu).Jak korzystać Bluebird w maszynopisie 2.1+

obecnie używam maszynopis 1.8 w moim projekcie i to działa prawidłowo:

import * as Promise from "bluebird"; 
async function f() : Promise<void> { 
    return Promise.delay(200); 
} 

Ale gdy próbuję skompilować z maszynopis 2.1:

index.ts(2,16): error TS1059: Return expression in async function does not have a valid callable 'then' member. 

googlowania kwestię korzystania Bluebird Promises w typescript, mam również f Dyskutują o wielu dyskusjach, komentarzach i PR, ale są one bardzo trudne do zrozumienia i podczas omawiania interesujących punktów, nie mogę znaleźć nigdzie tego, co mówi, jak mam teraz uruchomić to zadanie.

Jak więc mam korzystać z Bluebird do obietnic w maszynie 2.1?

Odpowiedz

-3

Aby uzyskać ogólny przegląd, należy spojrzeć na numer SO documentation page np. dla bluebirda możesz po prostu wpisać bluebird. Ten kod kompiluje grzywny dla mnie:

import Promise = require('bluebird') 
 
Promise.resolve("foo").then(function (msg) { 
 
    console.log(msg) 
 
})

+0

To nie jest to samo co mój przykład. Błąd w moim przypadku wynika z używania Bluebirda w funkcjach asynchronicznych, na czym bardzo polegam. – Ludwik

+0

Również myślę, że twój link jest zepsuty. – Ludwik

+0

Zobacz Bluebird w funkcji asynchronicznej: https://www.npmjs.com/package/babel-plugin-bluebird-async-functions – illeas

0

I to samo pytanie tutaj: https://github.com/Microsoft/TypeScript/issues/8331

W końcu moja własna odpowiedź tam pracował. Oto jak go używać w maszynopisie 2.3 bez dodatkowej .d.ts pliku:

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(); 

To straszne i nie będzie działać w przyszłości, gdy kierowanie natywną ES7, ponieważ w przyszłości async/await prostu nie powróci Bluebird obietnic i nic nie można z tym zrobić. Jednak do tego czasu i po przejściu na ES5 będzie to działało.

Pomimo wielu typów any, wydaje się, że jest to bezpieczny rodzaj. Jestem pewien, że można to poprawić.