我正在尝试为lodash/fp
及其咖喱和重载函数定义输入。为了保持简洁和可读性,我试图定义一些自动完成所有currying组合的接口,如下所示:
interface Curry1<A, Z> {
(arg1: A): Z;
}
interface Curry2<A, B, Z> {
(arg1: A): Curry1<B, Z>;
(arg1: A, arg2: B): Z;
}
interface Curry3 { ... }
使用map
作为测试用例,我想沿着以下几行定义一个函数:
const map<T, U>: Curry2<(arg: T) => U, T[], U[]>;
但这不好;你不能在这样的变量声明中使用泛型。我也尝试使用类(它以这种方式允许泛型,但不能作为函数调用)和命名空间(它们似乎根本没有改变任何东西,它们只是为代码添加更多大括号)伪装它。
我是否注定要重新宣布一堆function
这样的覆盖?
function map<T, U>(iteratee: (arg: T) => U): (data: T[]) => U[];
function map<T, U>(iteratee: (arg: T) => U, data: T[]): U[];
// This is equivalent to:
function map<T, U>(iteratee: (arg: T) => U): Curry1<T[], U[]>;
function map<T, U>(iteratee: (arg: T) => U, data: T[]): U[];
最后一对覆盖只是Curry2
的内联定义,它很快就会令人讨厌(特别是当你到达Curry3
和Curry4
时),此外只是毫无意义咕噜地写/生成。