
在使用 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[] });
方式二:隐式返回(简洁,适用于单表达式)
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