在TypeScript中手动curry添加函数

问题描述 投票:2回答:1

我正在尝试创建一个可选择curry的类型安全添加功能

    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'.

在函数定义和

Expected 2 arguments, but got 1.

在函数调用。

我已经看到这个问题的解决方案返回any类型,但我一直无法找到类型安全的解决方案。我目前可以使用TypeScript做什么?

typescript currying
1个回答
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
}

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

© www.soinside.com 2019 - 2024. All rights reserved.