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