1

我在正确键入 redis 节点包时遇到问题。作为简单 JSON.GET 的基本代码示例

import * as redis from 'redis';
const client = redis.createClient();
async function getSomeData() {
    return await client.json.get('keyname', { path: '$.path'})
}

异步函数返回一个 Promise,在这个例子中,我希望从 redis 返回的数据是一个对象数组,比如

type returnObject = {
  key1: string;
  key2: string;
}

我正在努力解决的是如何只从返回的数组中返回第一个对象,如果我尝试:

async function getSomeData() {
    return await client.json.get('keyname', { path: '$.path'})[0]
}

我在 vscode 中收到以下错误:

元素隐式具有“任何”类型,因为“0”类型的表达式不能用于索引类型“Promise<string | 号码 | 布尔值 | 日期 | (string | number | boolean | Date | (string | number | boolean | Date | (string | number | boolean | Date | (string | ... 5 more ... | null)[] | { ...; } | null)[] | { ...; } | null)[] | { ...; } | null)[] | { ...; } | 空>'。

因此,可以理解的是,如果我尝试类似

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

4

1 回答 1

1

我相信您await的操作是针对数组访问而不是对client.json.get. 我能够从 JavaScript 中得到类似的问题,并通过调用来解决它:

let results = await client.json.get('keyname', { path: '$.path'});
return results[0];
于 2022-02-24T20:52:29.030 回答