@fuckingawesomenigga

Как победить ошибку «This expression is not callable.»?

63290641d9787952633150.png
type StepFn = (val: number) => number | StepFn;

function add(val: number): number | StepFn {
  if (val) {
    return function sum(next) {
      if (!next) {
        return val;
      }
      return add(val + next);
    };
  } else {
    return 0;
  }
}

export default add;

console.log(add());
console.log(add(1)(2)());
console.log(add(2)(4)(6)());
console.log(add(4)(6)(8)(10)());
  • Вопрос задан
  • 756 просмотров
Пригласить эксперта
Ответы на вопрос 2
Lynn
@Lynn
nginx, js, css
Нужно явно рассказать TS-у что если аргумент falsy, то результатом будет число, а в остальных случаях новая функция.

Например так (песочница):
type StepFn = (val?: number) => number | StepFn;

function add(val: number): typeof add;
function add(val: 0): number;
function add(): number;

function add(val?: number): number | StepFn {
  if (val) {
    return function sum(next?: number): number | StepFn {
      if (!next) {
        return val;
      }
      return add(val + next);
    };
  } else {
    return 0;
  }
}

console.log(add());
console.log(add(1)(2)());
console.log(add(2)(4)(6)());
console.log(add(4)(6)(8)(10)());
Ответ написан
Комментировать
vabka
@vabka
Токсичный шарпист
Проблема в возвращаемом типе функции add.
Ты же сам написал, что возвращает "число или функцию". Компилятор не знает, что там вернётся, вот и просит тебя проверить
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы