打字稿:为承诺中的解析参数指定正确的返回类型

时间:2019-03-14 09:49:29

标签: javascript typescript

昨天,我决定玩打字稿,并尝试将一些基本的JavaScript承诺示例移植到打字稿Promise。但是,在移植样本的过程中,我遇到了一个仍然无法解决的问题。试图用谷歌也没有用。

场景: 我确实有一个返回Promise的函数,该函数在执行时解析为number。我也想在此样本上测试一些then场景。

请在下面找到代码示例:

function test_promise(): Promise<number>{
    return new Promise((resolve, reject) :number => {
        let result:number = 10;
        resolve(result);
    }).then(result => {            // first then
        console.log("Result: " + (typeof result)); // Result: number
        return result * 2; //
    }).then(result => {            // second then
        return result * 2;
    }).then(result => {            // third then
        return result * 2;
    });
}

我还将添加两个屏幕截图,以更加清晰。

截屏1:

enter image description here

截屏2

enter image description here

有些事情目前我还不清楚:

  1. 在屏幕快照1中,提示项并未说出typeof的结果是number,而是在console.log中打印该结果时说它是number。有什么区别?
  2. 如果它在控制台中打印的是number,那么为什么它不允许我对此执行乘法运算。

要使此示例正常工作,我需要在此处进行哪些更改?

请大家注意一下。谢谢。

此致

2 个答案:

答案 0 :(得分:2)

这里的解决方案是通过在Promise之后直接添加<number>来显式指定实例化的第一个new Promise对象的值类型,如下所示:

    /* Add <number> after new Promise */
    return new Promise<number>((resolve, reject) => {
        let result:number = 10;
        resolve(result);
    }).then(result => {            // first then
        console.log("Result: " + (typeof result)); // Result: number
        return result * 2; //
    }).then(result => {            // second then
        return result * 2;
    }).then(result => {            // third then
        return result * 2;
    });

这样做会通知Typescript第一个Promise值类型,从而可以推断出链中后续Promise的值类型。

这将反过来解决您的问题。有关Generics in Typescript can be found here的更多信息。希望有帮助!

答案 1 :(得分:0)

检查以下行:

return new Promise((resolve, reject) :number => {

: number表示该函数(或意义不大的构造函数)正在返回数字。这不是真的! new Promise显然返回了Promise,而您不必指定它。

您想说的也许是Promise处理的数字。您可以使用圆括号来实现:

return new Promise<number>((resolve, reject) => {