我在正确键入redis节点包时遇到了问题。作为简单JSON.GET的基本代码示例
import * as redis from 'redis';
const client = redis.createClient();
async function getSomeData() {
return await client.json.get('keyname', { path: '$.path'})
}异步函数返回一个承诺,在本例中,我希望redis返回的数据是一个对象数组,类似于
type returnObject = {
key1: string;
key2: string;
}如果我尝试从返回的数组中返回第一个对象,那么我所面临的困难是如何返回第一个对象:
async function getSomeData() {
return await client.json.get('keyname', { path: '$.path'})[0]
}我在vscode中得到以下错误:
元素隐式具有“任意”类型,因为'0‘类型的表达式不能用于索引类型'Promise
因此,可以理解的是,如果我尝试这样的操作,我会得到一个类似的错误,说明相同的不能分配到输入returnObject
async function getSomeData(): Promise<returnObject[]> {
return await client.json.get('keyname', { path: '$.path'})
}我认为这种类型来自@node-redis包中的RedisJSON类型,但无论哪种方式,我都不清楚如何解决这个问题。我唯一能接近的方法是使用一个助手函数,该函数将getSomeData的结果分配给任意类型,但这违背了使用TypeScript的意义。有人能告诉我应该如何正确地输入使用新的RedisJSON方法的异步函数,以便可以使用这些结果吗?谢谢
编辑:为了清晰起见,我使用的包是https://www.npmjs.com/package/redis
发布于 2022-02-24 20:52:29
我相信您的await是针对数组访问操作的,而不是对client.json.get的调用。我能够从JavaScript获得类似的问题,并通过调用:
let results = await client.json.get('keyname', { path: '$.path'});
return results[0];发布于 2022-07-01 22:49:29
async function getSomeData(): Promise<returnObject[]> {
return await client.json.get('keyname', { path: '$.path'}) as unknown as returnObject[]
}显然,您需要确保实际从client.json.get(...)获得的是Promise类型,因为这实际上是放弃返回值的类型,然后将其转换为所需的类型。
这不是最漂亮的解决方案,但根据我的经验,@redis/json中的类型并不是最好的。
希望这会有所帮助:)
https://stackoverflow.com/questions/71257771
复制相似问题