我尝试声明一个类型,该类型定义了一个函数类型的转换,生成一个具有相同参数但另一个返回类型的类型。
目标是编写一个函数createAction
,它需要一个函数并返回一个新函数,该函数期望与给定参数相同但返回另一个类型。
输入:期望字符串和数字的函数,返回类型R
:
const fn = (s: string, n: number) => ({ s, n, b: false })
const g = createAction(fn)
g
的预期类型是:
函数需要一个字符串和一个数字,返回类型{ payload: R }
:
typeof g === (s: string, n: number) => ({ payload: { s: string, n: number, b: boolean } })
这将允许我编写另一个函数createActions
,期望一个函数映射并返回相同的映射,但具有转换函数:
const t = createActions({
func1: (s: string) => ({}),
func2: (n: number, b: boolean) => ({ n }),
});
typeof t === {
func1: (s: string) => ({ payload: {} }),
func2: (n: number, b: boolean) => ({ payload: { n: number } }),
}
我可以使用不同数量的泛型参数创建一个类型重载,以涵盖许多不同的函数签名(见下文),但我正在寻找一种更通用的解决方案,它允许自动推断给定函数的参数编号和类型。使用类型重载使得上述功能映射无法实现。
通过对参数数量进行硬编码来使用泛型的基本解决方案:
type Transform<D, T1, R> = {
[K in keyof D]: (p1: T1) => ({
payload: R;
});
}
interface CreateActions<D, T1, R> {
(def: D): Transformed<D, T1, R>;
}
感谢您的帮助!