打字稿:函数参数签名的通用类型

时间:2017-09-18 15:55:51

标签: typescript generics type-inference function-signature

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

感谢您的帮助!

0 个答案:

没有答案