如何正确等待 TypeScript 中的承诺

How to correctly await a promise in TypeScript

我有一些代码,如果承诺拒绝或将其结果用于 要求 它是 reolved 类型的东西,我 continue 一个循环,如图所示在以下示例代码中:

for (const i in bar) {
    let error = false;
    const foo = await somePromise(i)
        .catch(() => { error = true; });
    if (error) continue;
    // Something that requires foo to be resolved here
}

我的问题是打字稿没有意识到 foo 最后被正确解析(它仍然认为它可能是 void 由于没有正确解析,因此给出 2339错误)。让打字稿意识到这没问题的正确、类型安全的方法是什么?

我发现修复它的方法是声明 fooany 类型,这不理想而且我的 linter 不喜欢这样,或者使用 .then,这也很糟糕,因为我必须开始在我的代码中嵌套多个 .then 语句和函数,导致大量缩进。

我会推荐

for (const i in bar) {
    try {
        const foo = await somePromise(i)
        // Something that requires foo to be resolved here
        // break???
    } catch {
        continue
    }
}

或确实 then,这并不难看,也不需要更多缩进(甚至嵌套):

for (const i in bar) {
    const error = await somePromise(i).then(foo => {
        // Something that requires foo to be resolved here
        return false;
    }, err => {
        return true;
    });
    if (!error) {
        // break???
    }
}