报错是因为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