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
相关产品推荐
相关产品推荐

