已声明positions的ScrollPositionRestore接口为何触发TS类型错误?
问题分析与解决
你遇到的TypeScript错误,核心原因是RxJS的scan操作符缺少符合ScrollPositionRestore接口的初始值,导致TypeScript无法正确推断累加器acc的类型。
当调用scan时,如果不传入初始值,TypeScript会尝试从累加器函数的返回值推断类型,但第一次执行时acc无初始值(默认是undefined),此时访问acc.positions自然会报错——因为undefined上不存在positions属性,即便你声明了泛型类型<Event, ScrollPositionRestore>,缺少初始值仍会让TypeScript对acc的类型产生歧义。
解决步骤
给scan操作符传入完全符合ScrollPositionRestore接口的初始值即可:
filter( (event) => event instanceof NavigationStart || event instanceof NavigationEnd, ), scan<Event, ScrollPositionRestore>( (acc, event) => ({ event, positions: { ...acc.positions, ...(event instanceof NavigationStart ? { [event.id]: this.contentArea.nativeElement.scrollTop } : {}), }, trigger: event instanceof NavigationStart ? event.navigationTrigger : acc.trigger, idToRestore: (event instanceof NavigationStart && event.restoredState && event.restoredState.navigationId + 1) || acc.idToRestore, }), // 传入符合接口的初始值 { event: new Event('init'), positions: {}, trigger: 'imperative', idToRestore: 0, } ),
补充说明
- 初始值里的
event用基础Event实例占位即可,后续会被流中的实际导航事件覆盖 positions初始化为空对象,匹配接口中{ [K: number]: number }的类型要求trigger和idToRestore需设置符合接口类型的初始值,比如示例中的'imperative'和0
内容的提问来源于stack exchange,提问作者Peter Boomsma
相关产品推荐
相关产品推荐

