无法调用类型缺少调用签名的表达式以返回已解决的函数

pra*_*999 4 javascript promise typescript es6-promise

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

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

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

  fullFilledPromiseReturner(4).then(data => {
    console.log(data);
  });
Run Code Online (Sandbox Code Playgroud)

现在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.在此处输入图片说明

我究竟做错了什么?

Tit*_*mir 5

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

最简单的解决方案是显式键入该函数以返回Promise联合类型而不是联合的a 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);
});
Run Code Online (Sandbox Code Playgroud)