Vyhledávání na webu

Přepsání TypeScriptu pro ES6 Promise s Bluebird


Mám knihovnu Node.js, která používá promise, přičemž její TypeScript deklarace používají ES6 Promise, i když samotná knihovna může být přizpůsobena pro použití libovolné knihovny promise.

Takže nemám problém předat do té knihovny Bluebird, aby ji mohla použít.

Problém je v tom, jak zpřístupnit rozhraní slibů Bluebird na deklarativní úrovni, protože moje knihovna deklaruje své rozhraní pouze přes ES6 Promise.

Existuje způsob, jak dát kompilátoru vědět, že používám jiný protokol Promise, aniž bych musel měnit samotnou knihovnu?

To druhé je samozřejmě háček, protože by nebyl žádný problém, kdybych mohl jen upravit knihovnu.

A pokud to pomůže pochopit, jak taková knihovna vypadá, vezměme si tento jednoduchý rozhraní z ní:

interface Protocol {
    methodName(param1:string, param2:number):Promise<Object[]>
}

a pak jeho velikost znásobte 1000krát.

Takže nemohu jen předstírat protokol s vlastním souborem. Musím přijít na to, jak kompilátoru říct, že Promise není výchozí ES6, ale ten, který poskytuje Bluebird pro TypeScript.

Odpověď č. 1

Můžete možné přepsat typ Promise pomocí unie https://www.typescriptlang.org/docs/handbook/advanced-types.html#union-types

To není preferovaný způsob

import Bluebird from 'bluebird';

type Promise = Promise | Bluebird;

Vycházeje z komentáře @Paarth výše, můžete typově převést svůj Bluebird promise na ES6 Promise.

Toto je preferovaný způsob

Vzhledem k třetí straně knihovny jako:

interface Protocol {
    methodName(param1:string, param2:number):Promise<Object[]>
}

Můžete ji konzumovat takto:

import Bluebird from 'bluebird';

class Http implements Protocol {
  methodName(url: string, payload: number): Promise<Object[]> {
    return <Promise<Object[]>>new Bluebird((resolve, reject) => {

      // Do whatever you need to do ... use the url & payload

      resolve([{ data: 'Done' }]);
    });
  }
}


let http = new Http();

http.methodName('//get-some-data', 10);

disclaimer: Tento kód jsem netestoval kompilací - momentálně nemám nastavené prostředí a jsbin způsobuje problémy s kompilátorem Typescriptu

Související články