Typescript:函数参数签名的泛型类型
我尝试声明一个类型,它定义了一个函数类型的转换,生成一个具有相同参数但另一个返回类型的类型。
目标是编写一个函数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>;
}
谢谢您的帮助!
链接地址: http://www.djcxy.com/p/7465.html上一篇: Typescript: Generic type of function parameter signature
下一篇: Infer constraints of type families from constraints of arguments