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