类型“ Promise <数字>”不可分配给类型“数字”

时间:2019-03-10 10:47:40

标签: typescript promise

我正在尝试从诺言中返回数字:从getActualId调用函数chrome.local.storage并返回诺言:

function getActualId(){
    return new Promise(function (resolve) {
        chrome.storage.sync.get({
            userId: true
        }, function (userId) {
            resolve(userId.userId);
        });
    });
}

此函数获得正确的值,但是当我从另一个函数调用它时,我不断得到getId函数返回一个Promise<number>而不是一个诺言。

async function getId(){
    let id:number = 0;
    await getActualId().then( function(userid:number){
        id =  userid;
    })
    return id
}

如何从id中获得getId而不是promise<number>的真实值?

1 个答案:

答案 0 :(得分:3)

您几乎从未在then函数中使用async。¹async函数的要点是您可以使用await代替。对于您的情况,您想将await getActualId()的结果分配给id

async function getId(){
    let id:number = await getActualId();
    return id;
}

(尽管不清楚为什么需要该功能,但这只是getActualId的包装。)

不过,getActualId存在问题,如果我们解决了该问题,我们就不需要在id中的getId上进行类型注释:getActualId缺少返回值类型注释,因此它隐式返回Promise<any>。如果返回Promise<number>,则需要这样说:

function getActualId(): Promise<number> {
    return new Promise(function (resolve) {
        chrome.storage.sync.get({
            userId: true
        }, function (userId) {
            resolve(userId.userId);
        });
    });
}

Example in the playground

function getActualId(): Promise<number> {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve(Math.floor(Math.random() * 100));
        }, 100);
    });
}
async function getId() {
    let id = await getActualId();
    return id;
}

如果您将鼠标悬停在id中的getId上,您将看到TypeScript由于number的签名而知道它是getActualId,因此我们不需要类型注释,因为TypeScript可以推断出来。


¹“几乎永远”是指几乎永远不会。我能想到的唯一示例是,如果您要执行大量并行操作(因此您正在使用Promise.all),并且需要对其中一个操作的结果进行转换。然后,您可能执行此操作:

const [first, second, third] = await Promise.all([
   firstOp(),
   secondOp().then(value => value.toUpperCase()),
   thirdOp()
]);

因为在await上使用secondOp会延迟thirdOp的启动(而上面的命令则不会)。