
在使用 ngrx 时,若 selector 函数体中遗漏 return 语句,将导致其隐式返回 void,从而使得 select() 管道推导出 observable
该错误本质是 TypeScript 类型推导问题,而非 NgRx 运行时异常。观察你提供的 selector 代码:
export const commentsSelector = createSelector(selectFeature, (state) => {
state.comments; // ❌ 无 return,函数返回类型为 void
});JavaScript 中,使用花括号 {} 的箭头函数不会自动返回值,必须显式写 return;否则函数体执行完毕后默认返回 undefined(其类型为 void)。因此 createSelector 推导出的输出类型为 Observable
✅ 正确写法有两种:
方式一:显式 return(推荐,语义清晰)
export const commentsSelector = createSelector(selectFeature, (state) => {
return state.comments; // ✅ 显式返回 IComment[]
});方式二:隐式返回(简洁,适用于单表达式)
BIWEB 门户版几经周折,最终与大家见面了。BIWEB门户版建立在ArthurXF5.8.3底层上,有了更加强大的功能。 BIWEB WMS v5.8.3 (2010.1.29) 更新功能如下: 1.修正了底层getInfo方法中的调用参数,做到可以根据字段进行调用。 2.修正了栏目安装和卸载后,跳转链接的错误。 3.修正所有栏目分类系统,提交信息页面错误。 4.新增后台删除信息后仍停留原分
export const commentsSelector = createSelector(selectFeature, (state) => state.comments // ✅ 无花括号,自动返回表达式结果 );
同样,isLoadingSelector 和 errorSelector 也存在相同问题,需同步修复:
export const isLoadingSelector = createSelector(selectFeature, (state) => state.isLoading); export const errorSelector = createSelector(selectFeature, (state) => state.error);
⚠️ 注意事项:
- 所有 selector 的返回值必须严格匹配其消费端(如 select())所期望的数据类型;
- 使用 ng build --prod 或开启严格类型检查("strict": true)时,此类错误会立即暴露;
- 建议在 selector 中添加类型注解以增强可读性与安全性(可选但强烈推荐):
export const commentsSelector = createSelector( selectFeature, (state): IComment[] => state.comments );
修复后,this.comments$ = this.store.pipe(select(commentsSelector)) 将正确推导为 Observable









