在TypeScript中手动咖喱add函数

时间:2019-03-14 15:17:13

标签: typescript currying

我正在尝试创建一个类型安全的添加函数,可以选择使用

+ semigroup.associative: OK, passed 100 tests.
+ semigroup.combineAllOption: OK, passed 100 tests.
+ semigroup.repeat1: OK, passed 100 tests.
+ semigroup.repeat2: OK, passed 100 tests.

我希望能够同时运行此功能

Either

    const add:
      | ((x: number) => (y: number) => number)
      | ((x: number, y: number) => number) = (x: number, y?: number) => {
      if (y !== undefined) {
        return x + y;
      } else {
        return (y: number) => x + y;
      }
    };

但是当前第二次调用在编译时引发两个类型错误。错误是

add(1, 5)

在函数定义和

add(1)(5)

在函数调用时。

我看到了返回Type '(x: number, y?: number | undefined) => number | ((y: number) => number)' is not assignable to type '((x: number) => (y: number) => number) | ((x: number, y: number) => number)'. Type '(x: number, y?: number | undefined) => number | ((y: number) => number)' is not assignable to type '(x: number) => (y: number) => number'. Type 'number | ((y: number) => number)' is not assignable to type '(y: number) => number'. Type 'number' is not assignable to type '(y: number) => number'. 类型的此问题的解决方案,但是我一直找不到类型安全的解决方案。我现在想用TypeScript做些什么?

1 个答案:

答案 0 :(得分:2)

是的,使用function overloads,您可以使用以下签名构造一个add()函数:

function add (x: number): (y: number) => number
function add (x: number, y: number): number
function add (x: number, y?: number): number | ((y: number) => number) {
    return y === undefined ? (y: number): number => x + y : x + y
}

前两个签名表示有效呼叫,最后一个签名是包含两个有效呼叫签名的联合化签名。