如何将redis条目转换为typescript类型?

wkyowqbh  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(354)

我有一个类,它像这样存储到redis示例的hashmap。

static async store(obj: KeyObject) {
    return client.hmset(`obj:${obj.objKey}`, {
      id: obj.id, // number
      ownerId: obj.ownerId.toBase58(), // string
      key: obj.key, // number
    });
  }

当我得到 get redis的这一行

{ 
  id : '1',
  ownerId: '2',
  key: '3'
}

我想得到 id 参数作为 number (就像我放进去的时候一样)
当我在程序中使用它时,我可以将它具体地转换为一个数字,但是当我得到它时,我宁愿将它转换为整个对象

client.hgetall(`obj:${objKey}`) as KeyObject

这可能吗?
谢谢!

bq9c1y66

bq9c1y661#

不,不可能不是打字造成的。当redis返回id时,它不是一个数字(这是redis的一个实现细节,它不区分字符串和数字,与js或ts无关)。您需要手动将其更改回:

const row = { 
  id : '1',
  ownerId: '2',
  key: '3'
}

row.id = Number(row.id)

如果您有多个键需要返回到一个数字,并且您感到很懒惰,则可以创建一个助手函数:

type ConvertKeys<Object, Keys extends Array<keyof Object>, To> = { 
  [P in keyof Object]: P extends Keys[number] ? To : Object[P]
}

function convertKeys<O, K extends Array<keyof O>, T>(
  converter: (arg: any) => T,
  obj: O, 
  ...keys: K
): ConvertKeys<O, K, T> {
  // type system is too stupid to see how this transformation works
  const copy = Object.assign({}, obj) as any
  keys.forEach(k => copy[k] = converter(copy[k]))
  return copy
}

然后使用它:

const fixedRow = convertKeys(Number, row, "id", "key")
const id: number = fixedRow.id; // A-OK!

相关问题