对象可能是“未定义”不应该抛出错误,因为上面有一个 rxjs 过滤器

问题描述 投票:0回答:1

我目前正在重构我的一项服务,遇到了一个相当烦人的问题。 我有一个 API,它返回一个具有多个可选属性的对象。当我想使用属性时,我首先必须检查该属性是否未定义,否则我会收到错误。这可以通过 if 语句来完成。重构后,我考虑将检查放在过滤器运算符内。这应该可以工作,并且只能为我提供具有所需属性的对象,但现在 linter 仍然会抛出错误。

interface OptionalObject {
  values?: number[]
}

const obs$$ = new BehaviorSubject<OptionalObject>({});
obs$$.pipe(
  filter((val) => !!val.values),
  map((val) => val.values.length) // Object is possibly 'undefined'
).subscribe(() => {

});

我认为我的项目使用了 ESLint

我用 if 尝试过,它有效,但我希望它能与 Rxjs 的过滤器一起使用

angular typescript rxjs eslint lint
1个回答
0
投票

解决方案是使用 TypeScript TypeGuard:

interface OptionalObject {
  values?: number[];
}

const obs$$ = new BehaviorSubject<OptionalObject>({});
obs$$
  .pipe(
    filter((val): val is {values: number[]} => !!val.values),
    map((val) => val.values.length)
  )
  .subscribe(() => {});
© www.soinside.com 2019 - 2024. All rights reserved.