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

ngrx从12升级到13后调用store.select()出现TS2769类型错误如何解决?

错误原因

NgRx v13强化了选择器的类型校验逻辑,你遇到的TS2769报错核心原因是:selectProjectsByCompany依赖的子选择器没有显式绑定根状态AppState,导致TypeScript推导该选择器的根状态为Object,和store实例要求的AppState类型不匹配。

解决方案

按以下步骤修改即可修复:

  • 修复auth切片选择器的根类型
    你的getUser选择器依赖的authObj应该是通过createFeatureSelector生成的,给它显式指定根状态泛型:
    // 修改前可能是const authObj = createFeatureSelector<AuthState>('auth')
    const authObj = createFeatureSelector<AppState, AuthState>('auth')
    
  • 校验project切片选择器的类型
    确认projectSelectors.selectEntities的根状态也是AppState,如果是自定义生成的切片选择器,同样补充根状态泛型即可。
  • (可选)给选择器显式声明泛型兜底
    如果类型推导还是异常,可以直接给createSelector指定泛型,避免自动推导出错:
    export const selectProjectsByCompany = createSelector<
      AppState,
      [CompanyContextState, User, Project[]],
      Project[]
    >(
      selectCompanyContext,
      getUser,
      projectSelectors.selectEntities,
      (
        { companyId },
        currentUser,
        projects,
      ): Project[] => {
        if (currentUser) {
          if (currentUser.role === UserRole.SUPERADMIN) {
            return projects.filter(
              (project: Project) => project.companyId === companyId,
            );
          } else {
            return projects.filter(
              (project: Project) => project.companyId === currentUser.companyId,
            );
          }
        }
        return [];
      },
    );
    
  • 优化AuthState的类型定义
    把AuthState里user的any类型替换为User | null,避免类型丢失引发后续推导问题:
    export class AuthState {
      permissions: string[];
      expires: number;
      user: User | null;
      username: string;
      isAuthenticated: boolean;
      token: string;
      refreshToken: string;
    }
    

修改完成后重新编译,store.select(selectProjectsByCompany)的类型报错就会消失。

内容的提问来源于stack exchange,提问作者Memke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 20:36:04