【问题标题】:Cannot invoke an expression whose type lacks a call signature for function returning resolved promise无法调用类型缺少返回已解析承诺的函数的调用签名的表达式
【发布时间】:2018-08-25 21:44:14
【问题描述】:

我正在尝试调用一个函数,该函数根据某些条件使用 Promise.resolve 返回已解决的承诺。

该函数的一个过度简化版本如下:

  function fullFilledPromiseReturner(num: number) {
    if (num > 5) {
      return Promise.resolve(5);
    } else {
      return Promise.resolve();
    }
  }

  fullFilledPromiseReturner(4).then(data => {
    console.log(data);
  });

现在 TypeScript 不让它通过编译器并抛出以下错误:

[ts] Cannot invoke an expression whose type lacks a call signature. Type '(<TResult1 = void, TResult2 = never>(onfulfilled?: ((value: void) => TResult1 | PromiseLike<TResu...' has no compatible call signatures.

我做错了什么?

【问题讨论】:

    标签: javascript typescript promise es6-promise


    【解决方案1】:

    问题是你的函数返回Promise<void> | Promise<number>,因为你在不同的分支上返回了不同的承诺类型。所以then 也将是一个联合类型,您将无法调用它,因为没有一个签名是通用的。

    最简单的解决方案是显式键入函数以返回联合类型的 Promise,而不是 Promisses 的联合:

    function fullFilledPromiseReturner(num: number): Promise<number | void> {
        if (num > 5) {
            return Promise.resolve(5);
        } else {
            return Promise.resolve();
        }
    } 
    fullFilledPromiseReturner(4).then(data => {
        console.log(data);
    });
    

    【讨论】:

    • 太好了!感谢您的快速回答。我会在 3 分钟内接受答案,因为堆栈溢出希望我接受:P
    猜你喜欢
    • 1970-01-01
    • 2017-09-01
    • 2017-12-19
    • 2021-02-06
    • 2017-07-14
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    相关资源
    最近更新 更多