打字稿异步/等待无法确定正确的返回类型

我在Typescript中有以下基于Promise的方法:

filterByParams(
  query: Aggregate<any[]>,
  params: ParamsObject
): Promise<Aggregate<any[]>> {
  return this.findSomething(params)
    .then<Aggregate<any[]>>((results: SomeResultType[]) => {
      const matcher = {
        // ... using results to match something
      };

      return query.match(matcher);
    });
}

该方法基本上是基于另一个查询的结果向(猫鼬)聚合添加过滤器。

这工作得很好,Typescript很高兴。

问题

如果我尝试将其转换为使用异步/等待模式,Typescript开始抱怨。这是转换后的方法:

async filterByParams(
  query: Aggregate<any[]>,
  params: ParamsObject
): Promise<Aggregate<any[]>> {
  const results: SomeResultType[] = await this.findSomething(params);

  const matcher = {
    // ... using results to match something
  };

  return query.match(matcher);
}

This time I get a compilation error from Typescript, on the return ...-line, telling me:

TS2322:无法将类型“ any []”分配给类型“ Aggregate

It seems like Typescript somehow cannot infer the correct return type from the query.match(matcher) function, and even casting it to as Aggregate<any[]> doesn't help.

If I remove the generic type from the then(..) function in the Promise-based method, I get largely the same error as when I use the async/await syntax.

我正在使用Typescript版本3.7.2

任何人都可以解释为什么会发生这种情况,以及是否有一种解决方法仍可以使用async / await -而不必将部分代码包装在promise中?我觉得到目前为止,我还没有尝试过显式地转换每种类型。

评论