javascript - Hur man använder Bluebird i Typescript 2.1+
(Jag har läst det här inlägget men det är från augusti och det svarar inte på min fråga för den aktuella TypeScript-versionen.)
Jag använder för närvarande Typescript 1.8 i mitt projekt och detta fungerar bra:
import * as Promise from "bluebird";
async function f() : Promise<void> {
return Promise.delay(200);
}
Men om jag försöker kompilera med Typescript 2.1:
index.ts(2,16): error TS1059: Return expression in async function does not have a valid callable 'then' member.
När jag googlade problemet med att använda Bluebird Promises i TypeScript, har jag också hittat många diskussioner, kommentarer och PR:er på GitHub, men de är alla väldigt svåra att förstå och även om de tar upp intressanta poänger, kan jag inte hitta någonstans där det står hur jag ska få detta att fungera nu.
Så, hur förväntas jag kunna använda Bluebird för Promises i Typescript 2.1?
Svar #1
Överväg att använda @types/bluebird-global enligt följande.
npm install --save-dev @types/bluebird-global
Importera detta en gång i din huvudingångspunkt.
// The same Promise API, everywhere.
import * as Promise from 'bluebird'
global.Promise = Promise
Se DefinitelyTyped-ärende #11027 för mer sammanhang.
Svar #2
Jag ställde samma fråga här: https://github.com/Microsoft/TypeScript/issues/8331
I slutändan fungerade mitt eget svar där. Så här använder du det i TypeScript 2.3 utan en extra .d.ts-fil:
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();
Det är fruktansvärt och kommer inte att fungera i framtiden när man riktar sig mot native ES7, eftersom i framtiden kommer async/await helt enkelt inte att returnera Bluebird-löften och inget kan göras åt det. Men fram till dess och när man transpilerar till ES5 kommer detta att fortsätta fungera.
Trots de flera any-typerna verkar det vara något typ-säkert. Jag är säker på att det kan förbättras.
