2016-04-12 23 views
7

Si consideri il seguente codice:Come trattare correttamente con promisifyAll in dattiloscritto?

import redis = require('redis'); //Has ambient declaration from DT 
import bluebird = require('bluebird'); //Has ambient declaration from DT 

bluebird.promisifyAll((<any>redis).RedisClient.prototype); 
bluebird.promisifyAll((<any>redis).Multi.prototype); 

const client = redis.createClient(); 

client.getAsync('foo').then(function(res) { 
    console.log(res); 
}); 

getAsync sarà errore fuori perché è creato al volo e non definito in qualsiasi file .d.ts. Allora, qual è il modo corretto per gestire questo?

Inoltre, anche se ho i file caricati per .d.ts Redis, ho ancora bisogno di lanciare redis-any da utilizzare per promisifyAll. In caso contrario, sarà fuoriuscire errore:

Property 'RedisClient' does not exist on type 'typeof "redis"' 

sta scrivendo al any l'unico modo facile andare?

+0

Avete mai trovato un modo per risolvere questo? Ho riscontrato lo stesso problema ... – zam6ak

+0

@ zam6ak Sì utilizzando la fusione delle dichiarazioni. Vedi la mia risposta qui sotto. – Dave

risposta

3

Sto risolvendo questo declaration merging il setAsyncgetAsync metodi. Ho aggiunto il seguente codice nel mio file personalizzato .d.ts.

declare module "redis" { 

    export interface RedisClient extends NodeJS.EventEmitter { 
     setAsync(key:string, value:string): Promise<void>; 
     getAsync(key:string): Promise<string>; 
    } 

} 
+2

è disponibile per grandi librerie? Cosa succede se si promifisy una lib che ha un sacco di metodo - dovresti ri-dichiarare tutti i metodi * Async()? Perché sarebbe noioso ... – zam6ak

+1

Penso che dichiararli esplicitamente sia essenzialmente il punto di usare Typescript. L'alternativa è usare '' che sostanzialmente ritorna alla natura dinamica (di javascript). – Dave

+1

Si potrebbe implementare una sorta di script offline che sarebbe una controparte statica di 'Promise.promisifyAll'. Ci vorrebbe un riferimento alle tipizzazioni originali e produrrebbe un "appendfix" con le funzioni '* Async'. – cubuspl42