gpt4 book ai didi

typescript - 类型 'Promise' 不可分配给类型 'number'

转载 作者:搜寻专家 更新时间:2023-10-30 21:26:04 27 4
gpt4 key购买 nike

我正在尝试从 promise 中返回数字:函数 getActualId来自 chrome.local.storage 的电话并返回一个 promise :

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

这个函数得到了正确的值,但是当我从另一个函数调用它时,我一直得到 getId函数返回 Promise<number>而不是 promise 。

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

如何获得 id 的实际值?来自 getId而不是 promise<number>

最佳答案

你几乎从不使用 thenasync函数。¹ 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;
}

如果您将鼠标悬停在 idgetId ,你会看到 TypeScript 知道它是一个 number感谢getActualId的签名,因此我们不需要类型注释,因为 TypeScript 可以推断它。


¹ 我所说的“几乎从不”是指真正几乎从不。我能想到的唯一例子是,如果你有一堆操作要并行执行(所以你正在使用 Promise.all )并且你需要对其中一个的结果进行转换。然后你可能这样做:

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

自从使用 awaitsecondOp会延迟 thirdOp 的开始(而上面没有)。

关于typescript - 类型 'Promise<number>' 不可分配给类型 'number',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55086889/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com