解决承诺的打字稿返回类型的可能性

时间:2018-07-20 05:06:24

标签: node.js typescript promise visual-studio-code typescript-typings

我想在Typescript中使用严格的return type语句。
当我用单个if-then-else语句编写函数时,vscode的TS Linter很聪明,可以接受我的返回值:

IfThenElseWorks

如果我尝试在单个.then()。catch()块中执行相同的操作,而该函数没有其他可能的运行方式,则我的linter将不接受返回类型。

Error Message in VsCode

兑现诺言也无法按预期进行

Return promise

我还检查了.finally()语句,该语句也无法正常工作,因此不适合在我的情况下使用。

来源:

var myPromise = new Promise(function (resolve, reject) {
    if (Math.round(Math.random()) == 1) {
        resolve("yay")
    } else {
        reject("nay")
    }
});

function returnYayOrNay(): string {
    myPromise
        .then((result) => {
            return result
        })
        .catch((result) => {
            return result
        })
}

编辑1:我想返回一个与Picture2中一样的字符串

2 个答案:

答案 0 :(得分:1)

returnYayOrNay函数的问题在于它不返回字符串。当您使用诺言的thencatch时,您正在传递一个函数(匿名箭头函数=>)。因此return result仅从该匿名函数返回。

我的猜测是您想返回myPromise的值。您无法直接返回此值,因为调用returnYayOrNaymyPromise的值可能尚不可用。因此returnYayOrNay也应返回一个承诺。

也将myPromise的默认键入为Promise{},因为打字稿无法根据resolvereject的使用来推断结果的类型

话虽如此,您有几种选择:

返回由thencatch调用创建的新承诺:

function returnYayOrNay() {
    return myPromise
        .then((result) => {
            return result
        })
        .catch((result : string) => {
            return result
        })
}

使用异步/等待

async function returnYayOrNay() {
    try{
        return await myPromise;
    }catch(e) {
        return e as string;
    }
}

答案 1 :(得分:0)

  

默认情况下,promise的返回类型为Promise<{}>。因此,您可以强制转换Promise返回值。

var myPromise = new Promise<string>(function (resolve, reject) {
   if (Math.round(Math.random()) == 1) {
      resolve("yay")
   } else {
      reject("nay")
   }
});
  

在上述示例中,返回值变为Promise<string>