我尝试声明一个类型,该类型定义函数类型的转换,生成具有相同参数但另一个返回类型的类型。
目标是编写一个函数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>;
}
谢谢您的帮助!