假设我有一个这样的函数集合:
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
}
感谢任何人谁可以帮助!!
1条答案
按热度按时间wf82jlnq1#
听起来你只是想要一种方法来确保你的action的'type'属性和'payload'属性类型与你的myFuncs对象中的一个函数兼容。一种方法是使用联合类型和Map类型。
例如:
也就是说,我们正在生成一个Map类型,其中myFuncs的每个K键Map到具有“type”和“payload”属性的对应对象,将Map类型转换为联合类型,其中对象可以是Map类型中定义的任何对象。
参考:https://www.typescriptlang.org/docs/handbook/2/mapped-types.html