一句话结论
NgRx 22 发布,新增资源扩展以解决错误状态下值访问异常,并支持联合类型动态深信号,显著提升 Angular 应用开发体验。
关键要点
- 新增实验性入口 `@ngrx/signals/resource`,提供资源扩展功能,封装 Angular 资源 API 以调整默认行为
- 内置四种资源扩展方案,支持通过 `provideResourceExtensions` 在应用、路由或组件层级注册默认扩展配置
- 深信号功能支持联合类型动态变化,对象字面量各成员拥有独立深信号,可用 `in` 运算符缩小类型范围后访问
- `@ngrx/eslint-plugin` 兼容 ESLint v10,同时移除对 ESLint v8 及旧版 `.eslintrc` 配置格式的支持
- 升级至版本 22 需依赖 Angular 22、TypeScript 6.0 及 RxJS 6.5 或 7.5 版本
背景与事实
面向 Angular 的响应式状态管理框架 NgRx 于近期发布 22 版本,这是该项目由社区驱动的重要更新。该开源框架由 Nx 和 CodeRabbit 赞助,源代码托管在 GitHub 上,主要通过 Store 和 Effects 提供全局状态管理能力,同时支持基于 Signal 的 SignalStore 模式。
此次更新的核心亮点是资源扩展功能,该功能通过全新的实验性入口 `@ngrx/signals/resource` 提供。在 Angular 原有的 resource 和 httpResource API 中,资源重新加载时会将 value() 重置为 undefined,而进入错误状态后读取该值会抛出异常。新引入的资源扩展机制在现有资源对象外部进行封装,专门调整这些默认行为,同时保留原有的资源类型信息。
新版本内置了四种扩展方案,并提供 provideResourceExtensions 函数,允许开发者在应用、路由或组件级别注册默认扩展。项目发起人 Marko Stanimirović 在最初的 RFC 中解释道,调整错误处理行为是将资源与 SignalStore 进一步集成的前提条件,因为“资源一旦进入错误状态,后续任何一次 patchState 调用都会抛出异常,因为它在内部会读取 value()”。
在动态深信号方面,版本 22 让深信号能够根据类型动态变化。此前,如果某个状态切片使用联合类型来描述不同状态(例如表示“尚未加载”的状态),它会被折叠成一个扁平的信号。现在,对象字面量中的每个成员都拥有独立的深信号,并且可以在使用 in 运算符缩小类型范围后访问相应的信号。
此外,新版本还增加了 SignalStoreFeatureType 工具类型,用于提取 Feature Factory 的状态及其成员。自定义 Feature 可以直接复用这些类型作为输入,无需手动重新声明。`@ngrx/store-devtools` 新增了 actionCreators 选项,允许从 Redux DevTools 分发 Action。`@ngrx/eslint-plugin` 现在兼容 ESLint v10,但不再支持 ESLint v8 和旧版 `.eslintrc` 配置格式。NgRx 文档网站也新增了浅色主题。
影响分析
对于中文开发者与从业者而言,此版本更新具有显著的工程化价值。资源扩展功能解决了 Angular 资源 API 在错误处理场景下的痛点,使得基于 Signal 的状态管理更加健壮。过去需要多个文件配合实现的状态管理逻辑,现在通过 NgRx Signals 通常只需一个文件即可完成,大幅降低了代码维护成本。
动态深信号功能对处理复杂联合类型的场景尤为友好。开发者在处理“尚未加载”“加载中”“加载成功”“加载失败”等状态时,可以保持代码的类型安全性,避免类型塌陷导致的逻辑错误。这要求团队在升级时仔细检查涉及联合类型的状态切片,利用 in 运算符进行类型收窄,以充分发挥新特性的优势。
需要注意,升级至版本 22 对依赖版本有严格要求,必须使用 Angular 22、TypeScript 6.0 以及 RxJS 6.5 或 7.5。许多破坏性变更提供了自动迁移工具,但团队仍需阅读迁移指南,特别是关于 Angular 22 调整资源时序行为的部分,这可能影响现有的测试用例。
适用边界
上述结论主要适用于已采用或计划采用 Angular 22 及 NgRx 22 的企业级前端项目。对于仍在使用 Angular 18 或更早版本的项目,由于版本兼容性限制,无法直接应用本版本的资源扩展和动态深信号功能。此外,资源扩展功能目前仍标记为实验性入口,生产环境使用需评估稳定性风险。对于主要依赖 RxJS 管道而非 Signal 机制的项目,本次更新的核心价值将显著降低,仅 ESLint 插件兼容性和文档主题更新具备实际意义。
孤本观察
从社区讨论来看,NgRx Signals 正在成为状态管理的首选方案,大幅简化了样板代码,这一趋势值得持续关注。编辑认为,随着 Signal 生态的成熟,RxJS 在 Angular 状态管理中的必要性正在下降,这反映了前端框架设计哲学的演变。





常见问题
升级 NgRx 22 需要哪些依赖版本?
需依赖 Angular 22、TypeScript 6.0 以及 RxJS 6.5 或 7.5 版本。
资源扩展功能如何注册配置?
通过 provideResourceExtensions 函数,可在应用、路由或组件层级注册默认扩展配置。
动态深信号如何处理联合类型?
对象字面量各成员拥有独立深信号,可用 in 运算符缩小类型范围后访问相应信号。
哪些项目无法应用 NgRx 22 的新功能?
仍在使用 Angular 18 或更早版本的项目,以及主要依赖 RxJS 管道而非 Signal 机制的项目。
Angular 资源在错误状态下访问值会有什么问题?
进入错误状态后读取 value() 会抛出异常,且后续 patchState 调用也会因内部读取 value 而抛出异常。
来源:InfoQ 中文 AI