Как добавить типы в карри функцию в TypeScript? - PullRequest
0 голосов
/ 30 мая 2019

В следующем фрагменте кода, где я объявил метод add с карри.

const add = (a: number) => {
  return (b?: number) => {
    return (b === undefined ? a : add(a + b))
  }
}

Это прекрасно работает, если я вызываю это со следующими аргументами: add(1)()

Но машинопись выдает следующую ошибку, когда я называю это так: add(1)(2)()

Cannot invoke an expression whose type lacks a call signature. Type 'number | ((b?: number) => number | ...)' has no compatible call signatures.

Что мне нужно добавить, чтобы включить типовое использование этого метода?

1 Ответ

2 голосов
/ 30 мая 2019

Я бы описал тип add() как следующий Add тип:

type Add = (a: number) => Add2;
type Add2 = ((b: number) => Add2) & (() => number);

Тип функции Add принимает число и возвращает Add2.

Функциональный тип Add2 - это перегруженная функция *1011*, которая возвращает другой тип в зависимости от количества и типа входящих аргументов. Это также самоссылка: если вы вызываете Add2 с помощью *Параметр 1014 *, вы получите Add2.

Вам более или менее необходимо использовать утверждения , чтобы убедить компилятор в том, что ваш add() является действительным Add:

const add = ((a: number) => (b?: number) =>
  b === undefined ? a : add(a + b)) as Add;

И тогда вы сможете использовать его как положено:

const x = add(1)(2)(3)(); // number
console.log(x); // 6

Ссылка на код

Хорошо, надеюсь, это поможет;удачи!

...