【问题标题】:Property 'finally' does not exist on type 'Promise<void>'类型“Promise<void>”上不存在属性“finally”
【发布时间】:2019-02-04 08:04:26
【问题描述】:

我正在尝试对 promise 使用 finally 方法,但我不断收到此错误。

Property 'finally' does not exist on type 'Promise<void>'.

我查找了与此类似的问题,这些问题建议将“es2018.promise”添加到 tsconfig.js 中的“lib”数组中。这会产生以下错误:

typescript error
        Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'esnext', 'dom',
        'dom.iterable', 'webworker', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator',
        'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol',
        'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string',
        'es2017.intl', 'esnext.asynciterable'.

非常感谢任何帮助解决此问题!

【问题讨论】:

  • 刚刚在堆栈本身上进行了测试,它可以工作。考虑提供一个minimal reproducible example 来重现该问题。
  • 你使用的是什么版本的 TypeScript?直到 2.7 才添加对 ES2018 的支持:github.com/Microsoft/TypeScript/issues/20463
  • 刚刚检查了它的 2.6.2,我会更新并检查它是否已解决。
  • 谢谢!这已经解决了!
  • 如果您在调用 finally 时遇到运行时错误,那么您的运行时环境中的 Promise 实现不支持 finally。 TypeScript 对此无能为力。您可以尝试安装this polyfill。

标签: angular typescript ionic-framework es6-promise


【解决方案1】:

直到 TypeScript 2.7 才添加 ES2018 支持。升级到该版本或更高版本可解决此错误。

【讨论】:

  • 我添加了esnext,然后它才起作用。我在 typescript-2.7 上。对于 typescript-2.7,它不适用于 es2018。这会支持旧浏览器吗?
  • 对于旧浏览器,您通常需要 polyfill。
【解决方案2】:

我通过使用 https://www.npmjs.com/package/promise.prototype.finally 解决了这个问题,因为这似乎是 ionic 而不是 typescript 的问题。我想它会在不久的将来修复。

感谢所有帮助我的人。

【讨论】:

    【解决方案3】:

    虽然 TypeScript 2.7 可能支持它,但您需要在 tsconfig.json 中定位:“ESNEXT”。

    这意味着您的代码可能无法在旧浏览器或 node.js 版本中运行。

    我正在使用:

    "@types/promise.prototype.finally": "^2.0.2"
    
    import { shim as finallyShim } from 'promise.prototype.finally'; 
    finallyShim();
    

    【讨论】:

      【解决方案4】:

      对于TypeScript 3.3.3,只需将es2018.promise 添加到您的tsconfig.json - compilerOptions.lib 配置中,如下所示:

      "lib": ["es2015", "es2016", "dom", "es2018.promise"]

      如果您使用vscode,也许您应该在将此选项添加到您的tsconfig.json 文件后reload window

      【讨论】:

      • 我突然遇到了这个问题。我已经很久没有更新任何东西了,而且我编译了很多都没有错误......然后今天突然出现这个“终于”错误。我使用的是 3.2.4 版。刚刚将 es2018 添加到 tsconfig.json 中,一切正常。似乎很奇怪。但是为什么 es2018.promise 而不仅仅是 es2018?
      • @Jette es2018 包含 ES2018.Intl、ES2018.Promise 和 ES2018.RegExp。因此,如果您只需要 finally 功能,只需将 es2018.promise 添加到 lib。
      • 包含多个 ES 版本(在您的情况下为 2015 和 2016)是否有意义?我知道您至少需要一个“完整”库,但我不确定您为什么需要两个。我正在使用["DOM", "es2017", "es2018.promise"],它对我有用。
      • 在TypeScript 2.7,你必须添加"esnext.promise"而不是"es2018.promise"
      【解决方案5】:

      确保先安装yarn/npm,如果tsconfig.json中已有es2018.promise,安装后错误消失。

      【讨论】:

        猜你喜欢
        • 2019-04-11
        • 2016-12-31
        • 2023-03-08
        • 2019-07-23
        • 2020-07-13
        • 1970-01-01
        • 1970-01-01
        • 2019-12-01
        • 2019-03-18
        相关资源
        最近更新 更多