1

我遇到了一个问题,我在一个存根函数的返回值上收到一条错误消息,它模拟了 Observable 的返回(使用rxjs-marbles)。

我遇到的问题是错误消息似乎表明返回类型上不存在对象的属性。

从单元测试文件

it('', marbles((m) => {
     stub(ambulatoryListDataManager, 'combinedMultipleSearchStatuses').returns(
        m.cold('a', [
          {
            searchStatus: SearchStatus.active, // SearchStatus is an enum type
            flags: { loaded: true, loading: false },
            list: recordList,
          },
          {...},
        ]),
      );
});

我收到以下类型错误:

Type '{ searchStatus: SearchStatus.active; flags: { loaded: true; loading: false; }; list: IRecord[]; }' is not assignable to type '{ searchStatus: SearchStatus; flags: ListFlagsSelection; list: IRecord[]; }[]'.
  Object literal may only specify known properties, and 'searchStatus' does not exist in type '{ searchStatus: SearchStatus; flags: ListFlagsSelection; list: IRecord[]; }[]'

context.d.ts(11, 9): The expected type comes from this index signature

如您所见,searchStatus它声称在 上不存在的属性Object literal就在错误消息中显示的类型定义中。它似乎没有抱怨其他属性。

请注意,这SearchStatus是一个枚举类型。

一切对我来说似乎都很好,那么为什么我会收到这个错误?

这是一个推断类型,所以我虽然可能有助于使函数的返回显式,但它没有帮助,我仍然有同样的问题。

对于进一步的上下文,如果需要,这里是函数,函数本身依赖。第一个函数是提供打字稿用来推断预期回报的详细信息的函数。

public combinedSearchStatuses(searchStatus: SearchStatus) {
    return combineLatest(...).pipe(
      map(([flags, list]) => ({ searchStatus, flags, list })),
    );
  }

  public combinedMultipleSearchStatuses(searchStatuses: SearchStatus[]) {
      return combineLatest(searchStatuses.map(
        (searchStatus) => this.combinedSearchStatuses(searchStatus)),
      ).pipe(distinctUntilChanged((a, b) => {...})

4

2 回答 2

1

该错误有点误导且难以发现,它抱怨数组searchStatus类型不存在,这是真的。

这条线具体来说,

Type '{ searchStatus: SearchStatus.active; flags: { loaded: true; loading: false; }; list: IRecord[]; }' is not assignable to type '{ searchStatus: SearchStatus; flags: ListFlagsSelection; list: IRecord[]; }[]'.

这是一个TS 游乐场,以进一步说明原因

我相信您需要返回一组可观察对象,而不是带有一组对象的可观察对象。

就像是 [m.cold('a', { ... }, m.cold('a', {...})]

于 2021-12-09T20:56:36.527 回答
1

在 Antonios 回答需要返回 Observables 数组之后,我意识到我忽略了 rxjs 弹珠定义中的一个步骤。我需要定义返回步骤a

它应该是这样的:

 stub(ambulatoryListDataManager, 'combinedMultipleSearchStatuses').returns(
        m.cold('-a', {
          a: [
            {
              searchStatus: SearchStatus.active,
              flags: { loaded: true, loading: false },
              list: recordList,
            },
            {
              searchStatus: SearchStatus.active,
              flags: { loaded: true, loading: false },
              list: recordList,
            },
          ],

由于我忘记正确定义对象,因此抱怨返回未正确定义

于 2021-12-09T21:54:06.157 回答