如何修改常量对象类型的值的类型# typescript

iyfjxgzm  于 2022-11-26  发布在  TypeScript
关注(0)|答案(1)|浏览(159)

我有一个常量对象类型,它的值类型是函数,我想通过这个类型得到另一个常量对象类型,并将函数的返回值类型改为Promise类型。

const CONST_METHOD_MAP = {
  ready: (str: string) => str,
  b: (num: number) => num,
  c: () => Promise.resolve(1)
} as const

需要
第一次
原因是我想把一些函数转换成web worker函数,所以CONST_ METHOD_ MAP是我配置的想要转换成web worker的同步函数的集合,所以我的funcMap值的内容是调用web worker的函数,所以它的返回值会从同步变成异步,然后因为我的funcMap是从常量对象生成的,其类型也应该是常量类型
我想构建一个常量对象类型。当我调用funcMap Ready ready的参数类型是Parameters〈类型的CONST_ METHOD_ MAP ['ready']〉,而不是Parameters〈类型的CONST_ METHOD_ MAP [类型的CONST_METHOD_MAP]〉,由于这个函数将使用Web工作器来执行逻辑,它的返回值是异步的,我希望函数Mapready的返回值类型是Promise而不是Promise

btxsgosb

btxsgosb1#

CONST_METHOD_MAP是常数,不是型别,如果没有typeof,就无法将它当做型别使用
所以你需要做的就是使用typeof,当你使用CONST_METHOD_MAP时,你也使用K(大写),这就是为什么你的类型不正确,使用小写的k,它会工作

const CONST_METHOD_MAP = {
  ready: (str: string) => str,
  b: (num: number) => num,
  c: () => Promise.resolve(1)
} as const

type MyType<K extends keyof typeof CONST_METHOD_MAP = keyof typeof CONST_METHOD_MAP> =
  {
    [k in K]: (
      ...args: Parameters<typeof CONST_METHOD_MAP[k]> // You were using uppercase K here
    ) => Promise<ReturnType<typeof CONST_METHOD_MAP[k]>> // and here
  }

const funcMap = {} as MyType
const res = funcMap.ready()

相关问题