我目前正在重构我的一项服务,遇到了一个相当烦人的问题。 我有一个 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 的过滤器一起使用
解决方案是使用 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(() => {});