【问题标题】:Property 'catch' does not exist on type 'PromiseLike<any>'类型“PromiseLike<any>”上不存在属性“catch”
【发布时间】:2023-04-10 02:47:01
【问题描述】:

我有以下代码:

this.afDb.list('/demo').push({a: 'b'})
    .then(_ => console.log('works'))
    .catch(err => console.log('err: ', err));

我在“catch”上收到以下错误:

[ts] Property 'catch' does not exist on type 'PromiseLike<any>'.

看起来像是 AngularFire2 的错误?

【问题讨论】:

    标签: javascript firebase firebase-realtime-database angularfire2


    【解决方案1】:

    报错是因为typescript中的PromiseLike接口缺少catch方法。这与将“thenable”定义为具有then 方法的对象是一致的。

    接口 PromiseLike {
        /**
         * 为解决和/或拒绝 Promise 附加回调。
         * @param onfulfilled Promise 解决时执行的回调。
         * @param onrejected 当 Promise 被拒绝时执行的回调。
         * @returns 一个 Promise 用于完成哪个回调被执行。
         */
        那么(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): PromiseLike;
    }
    

    它是在 gitHub 上的 lib.es2015.promise.d.ts 中定义的,从第 1291 行开始。(链接的 HTML 页面大小为 5.5MB - 可能需要一段时间。)

    请记住,A5+ spec 没有提到 catch 方法,并且 ES6(ECMAScript 2015)承诺提供 catch 作为 Promise.prototype 函数,它只是调用 then 的第一个参数catch 作为then 的第二个参数。

    最简单的解决方案可能是使用两个参数then 调用:

    this.afDb.list('/demo').push({a: 'b'})
        .then(_ => console.log('works'),
              err => console.log('err: ', err));
    

    或将Promise.prototype.catch 的代码扩展为then 调用:

    this.afDb.list('/demo').push({a: 'b'})
        .then(_ => console.log('works'))
        .then( null, err => console.log('err: ', err)); // catch
    

    【讨论】:

      猜你喜欢
      • 2018-07-17
      • 1970-01-01
      • 1970-01-01
      • 2016-09-01
      • 2021-02-08
      • 2019-09-20
      • 2018-09-09
      • 2019-12-31
      相关资源
      最近更新 更多