typescript 你能创建一个Map类型来将键Map到值吗?

k3bvogb1  于 2023-05-19  发布在  TypeScript
关注(0)|答案(1)|浏览(165)

假设我有一个这样的函数集合:

const myFuncs = {
  appendFoo: (s: string) => `${s}FOO`,
  addFive: (n: number) => n + 5,
}

Map类型让我可以做一些简单的事情,比如为Map到myActions中的一个或多个函数的参数集合创建一个泛型类型,如下所示:

type MyFuncInputs = Partial<{ [k in keyof typeof myFuncs]: Parameters<typeof myFuncs[k]>[0] }>

......但这使得我可以用那个通用类型描述的对象的结构相当僵化。例如,假设myFuncs是一个reducer的处理程序集合,我想创建一个泛型类型来描述该reducer的操作。
下面是无效的类型脚本,但希望它能说明我想做的事情:

type MyAction = {
  type: [k in keyof typeof myFuncs],
  payload: Parameters<typeof myFuncs[k]>[0]
}

有没有办法创造出这样的东西?
我得到的最接近的结果是这样的,但我希望有一种方法可以从对象的type推断F的值,而不必指定两次:

type MyAction<F extends keyof typeof myFuncs> = {
  type: F,
  payload: Parameters<typeof myFuncs[F]>[0] 
}

const fooAction: MyAction<'appendFoo'> = {
  type: 'appendFoo',
  payload: 'bar'
}

const addAction: MyAction<'addFive'> = {
  type: 'addFive',
  payload: 1
}

感谢任何人谁可以帮助!!

wf82jlnq

wf82jlnq1#

听起来你只是想要一种方法来确保你的action的'type'属性和'payload'属性类型与你的myFuncs对象中的一个函数兼容。一种方法是使用联合类型和Map类型。
例如:

type MyAction = { [K in keyof typeof myFuncs]: { type: K, payload: Parameters<typeof myFuncs[K]>[0] } }[keyof typeof myFuncs];

const fooAction: MyAction = {
  type: 'appendFoo',
  payload: 'bar'
}

const addAction: MyAction = {
  type: 'addFive',
  payload: 1
}

也就是说,我们正在生成一个Map类型,其中myFuncs的每个K键Map到具有“type”和“payload”属性的对应对象,将Map类型转换为联合类型,其中对象可以是Map类型中定义的任何对象。
参考:https://www.typescriptlang.org/docs/handbook/2/mapped-types.html

相关问题