首页
/ NgRx Signals 18.0.0版本中信号存储的类继承问题解析

NgRx Signals 18.0.0版本中信号存储的类继承问题解析

2025-05-28 15:47:36作者:丁柯新Fawn

问题背景

在NgRx Signals 18.0.0-rc.3版本中,开发者在使用signalStore作为基类进行类继承时遇到了类型错误。具体表现为当尝试在子类中使用patchState方法时,编译器会抛出类型不匹配的错误,提示"this"参数无法赋值给WritableStateSource类型。

技术细节分析

这个问题源于NgRx Signals 18.0.0版本对信号存储安全性的增强。新版本默认将信号存储的状态设置为受保护状态(protectedState: true),这意味着状态只能在信号存储内部访问,而不能通过继承的子类访问。

解决方案

要解决这个问题,需要在创建信号存储时显式地将protectedState选项设置为false:

const AuthClientStoreType = signalStore(
  { protectedState: false },  // 关键配置
  withState(initialState),
  withCallState(),
  withComputed(({ userInfo }) => ({
    isLoggedIn: computed(() => !userInfo),
  })),
);

这样配置后,子类就可以正常继承并使用patchState等方法了。

最佳实践建议

  1. 安全性考量:虽然关闭protectedState可以解决继承问题,但开发者应当权衡状态访问的安全性需求。只有在确实需要子类访问状态时才关闭此选项。

  2. 迁移建议:从旧版本升级时,可以使用ng update命令自动执行迁移脚本,它会自动添加protectedState: false配置。

  3. 替代方案:考虑是否真的需要类继承,或许组合模式(composition)会是更好的选择,通过将信号存储作为类属性而不是基类来使用。

版本兼容性说明

这个问题主要影响NgRx Signals 18.0.0及以上版本。如果项目暂时无法升级,可以考虑以下方案:

  • 暂时停留在17.x版本
  • 按照上述方法修改所有继承signalStore的类

总结

NgRx Signals 18.0.0引入的状态保护机制是为了提高应用的安全性,虽然它带来了一些迁移成本,但从长远来看有助于构建更健壮的应用程序。开发者应当理解这一变化背后的设计意图,并根据项目需求合理配置protectedState选项。

登录后查看全文
热门项目推荐