如何使用Q.Promise和catch子句类型检查创建方法

时间:2016-07-12 22:45:02

标签: typescript

我有以下方法:

class A {

  m(): Q.Promise<MyObject> {
    return someAsyncOp()
        .then(x => transformX(x))
        .catch(err => {
          log.error(err);
          throw err; // <-- doesn't type check
        })
  }
}

我想要完成的是获得此方法的类型检查。到目前为止,似乎它期望catch块返回Promise中参数化类型的东西。

这很奇怪,因为一个方法可以返回或抛出,所以在我看来这应该键入check。

没有catch子句,它会进行类型检查。使用catch子句编译失败,错误为Type Q.Promise<void> is not assignable to Q.Promise<MyObject>。这个错误让我相信编译器希望我在catch子句中返回一个值,据我所知,我没有义务这样做。

有没有办法让这种类型检查?我做错了什么,或者打字稿不支持我试图做的事情吗?

Typescript编译器版本1.8.10

2 个答案:

答案 0 :(得分:0)

  

我做错了什么或TypeScript不支持我正在尝试做的事情

你没有做错任何事。 catch场景完全不受限制。

的原因

字面上任何可能会导致错误进入catch。基本上TypeScript不会沿着强制你在每个点声明throws的java路径

答案 1 :(得分:0)

我的老师向我解释了这一点。显然它就像参数化lambda表达式一样简单:

class A {

  m(): Q.Promise<MyObject> {
    return someAsyncOp()
        .then(x => transformX(x))
        .catch((err): MyObject => { // <-- Now everything compiles fine.
          log.error(err);
          throw err; 
        })
  }
}