当由Typescript 2.0生成JS时,Bluebird的过滤捕获被破坏

时间:2017-01-03 14:32:44

标签: typescript bluebird

我看到的错误与此相同(来自此处:Catch Error Type in Bluebird Not Working):

I have a custom error class:

class NetworkError extends Error {
  constructor() {
    super('Network Error');
    this.name = 'NetworkError';
  }
}
     

我想特别处理它:

import {NetworkError} from '../../common/errors';
someFunc().catch(NetworkError, err => {
  // this is missed
}).catch(err => {
  // this is hit
});
     

但它正在跳过我的自定义捕获并击中一般捕获。如果我   改变它,它的工作原理:

someFunc().catch({name: 'NetworkError'}, err => {
  // this is hit
}).catch(err => {
  // this is missed
});
     

显然第一种方式是首选。我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

原因是对Typescript 2.0的最新升级。 具体做法是:

  

将a的值替换为a返回的值的一部分   超级(...)调用,子类化错误,数组和其他可能不再   按预期工作。这是因为构造函数的功能   对于Error,Array等使用ECMAScript 6的new.target进行调整   原型链;但是,没有办法确保价值   在ECMAScript 5中调用构造函数时的new.target。其他   低级编译器默认情况下通常具有相同的限制。

https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work

此解决方法为我解决了问题,但不适用于IE 10和之前的: 任何超级调用后添加以下代码。

if (Object.setPrototypeOf) {
  Object.setPrototypeOf(this, XHRError.prototype);
} else {
  this.__proto__ = XHRError.prototype;
}