使用Typescript中的可调用接口声明泛型函数

时间:2016-12-26 20:26:43

标签: generics typescript typescript-typings

我正在尝试为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的内联定义,它很快就会令人讨厌(特别是当你到达Curry3Curry4时),此外只是毫无意义咕噜地写/生成。

0 个答案:

没有答案