You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已声明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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 09:57:15