首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表示对象属性不存在的TS,同时显示它存在

表示对象属性不存在的TS,同时显示它存在
EN

Stack Overflow用户
提问于 2021-12-09 20:47:36
回答 2查看 82关注 0票数 1

我遇到了一个问题,就是我收到了一个关于存根函数返回值的错误消息,这个消息模拟了一个可观察到的函数的返回(使用rxjs-marbles)。

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

从单元测试文件中

代码语言:javascript
复制
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,
          },
          {...},
        ]),
      );
});

我得到以下类型错误:

代码语言:javascript
复制
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枚举类型。

对我来说一切都很好,为什么我会犯这个错误呢?

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

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

代码语言:javascript
复制
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) => {...})
EN

回答 2

Stack Overflow用户

发布于 2021-12-09 20:56:36

这个错误有点误导性,很难发现,它抱怨searchStatus不存在于数组类型上,这是正确的。

特别是这条线,

代码语言:javascript
复制
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', {...})]

票数 1
EN

Stack Overflow用户

发布于 2021-12-09 21:54:06

Antonios回答了返回可观测数据数组的必要性之后,我意识到我忽略了rxjs大理石定义中的一个步骤。我需要为a定义返回步骤

下面是它应该是什么样子:

代码语言:javascript
复制
 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,
            },
          ],

由于我忘记正确定义对象,所以它抱怨返回没有正确定义。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70296517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档