Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何正确处理typescript中的promisifyAll?_Javascript_Typescript_Promise_Bluebird - Fatal编程技术网

Javascript 如何正确处理typescript中的promisifyAll?

Javascript 如何正确处理typescript中的promisifyAll?,javascript,typescript,promise,bluebird,Javascript,Typescript,Promise,Bluebird,考虑以下代码: 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>

考虑以下代码:

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);
});
将它键入
any
是唯一简单的方法吗?

我正在通过
setAsync
&
getAsync
方法解决这个问题。我在自己的自定义
.d.ts
文件中添加了以下代码

declare module "redis" {

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

}
声明模块“redis”{
导出接口RedisClient扩展NodeJS.EventEmitter{
setAsync(key:string,value:string):Promise;
getAsync(key:string):承诺;
}
}
我正在通过
setAsync
getAsync
方法解决这个问题。我在自己的自定义
.d.ts
文件中添加了以下代码

declare module "redis" {

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

}
声明模块“redis”{
导出接口RedisClient扩展NodeJS.EventEmitter{
setAsync(key:string,value:string):Promise;
getAsync(key:string):承诺;
}
}

只是补充了Dave的答案,根据我的需要,我必须为原子操作添加Multi

declare module 'redis' {
    export interface RedisClient extends NodeJS.EventEmitter {
        execAsync(...args: any[]): Promise<any>;
        hgetallAsync(...args: any[]): Promise<any>;
        // add other methods here
    }
    export interface Multi extends Commands<Multi> {
        execAsync(...args: any[]): Promise<any>;
        // add other methods here
    }
}

声明模块'redis'{
导出接口RedisClient扩展NodeJS.EventEmitter{
execAsync(…args:any[]):Promise;
hgetallAsync(…args:any[]):承诺;
//在此处添加其他方法
}
导出接口多扩展命令{
execAsync(…args:any[]):Promise;
//在此处添加其他方法
}
}

只是补充了Dave的答案,根据我的需要,我必须为原子操作添加Multi

declare module 'redis' {
    export interface RedisClient extends NodeJS.EventEmitter {
        execAsync(...args: any[]): Promise<any>;
        hgetallAsync(...args: any[]): Promise<any>;
        // add other methods here
    }
    export interface Multi extends Commands<Multi> {
        execAsync(...args: any[]): Promise<any>;
        // add other methods here
    }
}

声明模块'redis'{
导出接口RedisClient扩展NodeJS.EventEmitter{
execAsync(…args:any[]):Promise;
hgetallAsync(…args:any[]):承诺;
//在此处添加其他方法
}
导出接口多扩展命令{
execAsync(…args:any[]):Promise;
//在此处添加其他方法
}
}

另一种需要较少代码的方法是扩展Redis对象,如下所示:

import { promisify } from 'util';
import { ClientOpts, RedisClient } from 'redis';

class AsyncRedis extends RedisClient {
  public readonly getAsync = promisify(this.get).bind(this);
  public readonly setAsync = promisify(this.set).bind(this);
  public readonly quitAsync = promisify(this.quit).bind(this);
  public readonly rpushAsync: (list: string, item: string) => Promise<number> = promisify(
    this.rpush
  ).bind(this);
  public readonly blpopAsync: (
    list: string,
    timeout: number
  ) => Promise<[string, string]> = promisify(this.blpop).bind(this);
  public readonly flushdbAsync = promisify(this.flushdb).bind(this);
}

另一种需要更少代码的方法是扩展Redis对象,如下所示:

import { promisify } from 'util';
import { ClientOpts, RedisClient } from 'redis';

class AsyncRedis extends RedisClient {
  public readonly getAsync = promisify(this.get).bind(this);
  public readonly setAsync = promisify(this.set).bind(this);
  public readonly quitAsync = promisify(this.quit).bind(this);
  public readonly rpushAsync: (list: string, item: string) => Promise<number> = promisify(
    this.rpush
  ).bind(this);
  public readonly blpopAsync: (
    list: string,
    timeout: number
  ) => Promise<[string, string]> = promisify(this.blpop).bind(this);
  public readonly flushdbAsync = promisify(this.flushdb).bind(this);
}

你有没有找到解决这个问题的方法?我遇到了同样的问题…@zam6ak Yes使用声明合并。请看下面我的答案。你有没有找到解决这个问题的方法?我遇到了同样的问题…@zam6ak Yes使用声明合并。请参阅下面我的答案。对于大型库,这是可维护的吗?如果你推荐一个有很多方法的库,你会不得不重新声明所有的*Async()方法吗?因为那将是乏味的…我认为显式声明它们本质上是使用Typescript的要点。另一种选择是使用
,它基本上返回到(javascript的)动态特性。可以实现某种离线脚本,它将是
Promise.promisifyAll
的静态副本。它将引用原始打字,并将生成一个带有
*Async
函数的“appendfix”。真的希望typescript团队能用漂亮的语言添加一些promisifyAll这对于大型库来说是可维护的吗?如果你推荐一个有很多方法的库,你会不得不重新声明所有的*Async()方法吗?因为那将是乏味的…我认为显式声明它们本质上是使用Typescript的要点。另一种选择是使用
,它基本上返回到(javascript的)动态特性。可以实现某种离线脚本,它将是
Promise.promisifyAll
的静态副本。它将引用原始打字,并将生成一个带有
*Async
函数的“appendfix”。真希望typescript团队能够用漂亮的语言添加一些promisifyAll