【问题标题】:Property finally is missing in type PromisePromise 类型中最终缺少属性
【发布时间】:2018-12-12 22:58:25
【问题描述】:

我很确定我可以自己解决这个问题,但如果它可以帮助其他人,我想分享并节省其他人的时间。

我不得不添加 es6-promise 库来消除这个错误

Promise only result to a type, but is only used as a value here.

当我尝试使用 Promise.all 时(请参阅 this discussion )。到目前为止它工作得很好,当我尝试使用来自 MongoDB 的 Promise 时出现错误。

Promise<whatever> is not assignable to Promise<any>
    Property 'finally' is missing in type Promise<whatever>

根据this issue on es6-promise(如果我没看错的话),新的 finally 属性正在破坏兼容性。它在 Promise Mongo 返回上,但不在我从 es6-promise 导入的那个上。

有什么想法吗?

【问题讨论】:

  • 我尝试将 es6-promise 固定到 4.1.1 并简单地删除它。我使用打字稿 2.8.3
  • 您是否尝试过仅使用内置的承诺定义?在 tsconfig 中:"lib": ["es5","es2015.promise","dom", "scripthost"]
  • 刚试过,不行。我不愿意更新 Typescript,因为我很确定这会破坏一切
  • 更新到 2.9.2,仍然无法正常工作(但看起来编译器现在默认使用 --pretty... 错误更漂亮,颜色更整洁,但它仍然存在)。
  • 我并不一定建议你升级 tsc,如果你只需要 Promises 的定义,就可以使用内置的。即使在以es5 为目标时,您也可以通过使用上面的 libs 选项来执行此操作。并删除 es6-promise

标签: typescript es6-promise finally


【解决方案1】:

我是注意到finally shim 破坏了linked issue 上的Promise 兼容性的人。很高兴看到这引起了一些关注。以下是一些选项:

1。完全依赖 TypeScript 核心库的类型

tsconfig.json

{
    "compilerOptions": {
        "lib": ["DOM","ES5","ScriptHost", "es2018.promise"]
    }
}

安装 shim,在应用启动时运行一次 polyfill,然后使用全局 Promise 对象,而不是继续从 es6-promise 导入 Promise 类。我发现这是最具互操作性的方式。

npm install --save es6-promise@latest

请注意,在最近的几个版本中,es6-promise 一直在捆绑自己的类型,这些类型与 TypeScript 的内置 Promise 库的类型冲突。

2。使用不包括 finally shim 的旧版 es6-promise

注意:当然这意味着你不能使用finally

{
    "compilerOptions": {
        "lib": ["DOM","ES5","ScriptHost"]
    }
}

在他们引入finally 之前安装最后一个版本的es6-promise,并使用这些类型:

npm install --save es6-promise@4.2.2 && npm install --save-dev @types/es6-promise@0.0.32

(或者以其他方式省略这些类型并将es2015.promise 添加到tsconfig.json 中的compilerOptions.lib 数组中。)

【讨论】:

  • 其他人请注意:当您将已解决的承诺值视为承诺时,您可能会遇到非常类似的错误。当你处理嵌套的 Promise 时,这可能会让人绊倒。
  • @Barbarrosa 我想我可能遇到了你描述的问题......关于如何解决它的任何指示?
  • @MaxWaterman 我不确定您的具体情况,但通常您需要更新类型以反映非承诺值并正确访问器以避免使用不存在的属性非承诺类型。
【解决方案2】:

如果您只需要 Promise 的正确类型定义,那么您可以使用 typescript 附带的内置定义(我这样说是因为您注意到您实际使用的承诺具有 @987654322 @方法符合预期)。

为此,请从您的项目中删除 es6-promise 并在 tsconfig 中将您的库更改为:

{
    ....
    "lib": ["es5","es2015.promise","dom", "scripthost"] 
    ....
} 

【讨论】:

  • 我正在使用 typescript 2.7.2 并希望最终在我的承诺中使用。这解决了它..但是你在目标和模块中设置了什么?有没有办法用我的版本更新到 2018 年?
猜你喜欢
  • 2019-12-24
  • 1970-01-01
  • 1970-01-01
  • 2021-04-02
  • 2021-01-14
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 2020-12-31
相关资源
最近更新 更多