Angular中NgRX Effects统一错误处理的类型安全实现问题
NgRX Effects统一错误处理的类型安全实现
要给errorActions定义正确的类型,确保Effect具备类型安全性且能识别action必然包含error属性,可按以下方式实现:
1. 导入必要类型
先从NgRX库中导入核心类型:
import { ActionCreator, TypedAction, createAction, props } from '@ngrx/store'; import { Actions, createEffect, ofType } from '@ngrx/effects';
2. 定义错误Action的统一类型
为所有错误Action创建类型别名,约束它们必须基于ErrorProperties接口生成:
export interface ErrorProperties { error: string }; // 约束错误ActionCreator的类型 type ErrorActionCreator = ActionCreator<string, (props: ErrorProperties) => ErrorProperties & TypedAction<string>>;
3. 定义类型安全的errorActions数组
用上面的类型别名标注数组,同时使用readonly(ofType内部期望只读数组类型):
const createFailed = createAction('[CreateFailed]', props<ErrorProperties>()); const deleteFailed = createAction('[DeleteFailed]', props<ErrorProperties>()); const errorActions: readonly ErrorActionCreator[] = [createFailed, deleteFailed];
4. 实现统一处理的Effect
此时ofType(...errorActions)会自动推断action类型包含error属性,保证类型安全:
@Injectable() export class AppEffects { handleError = createEffect(() => this._actions.pipe( ofType(...errorActions), tap((action) => { // TypeScript会自动识别action.error,具备完整类型提示 console.log('统一处理错误:', action.error); }) ), // 若该Effect无需触发新Action,需设置dispatch: false { dispatch: false } ); constructor(private _actions: Actions) {} }
类型安全说明
ErrorActionCreator类型确保数组内的每个ActionCreator都必须接收ErrorProperties作为参数,从而保证生成的Action必然包含error属性。- TypeScript会自动推断
ofType返回的Observable中action的类型,action.error不会出现类型错误,同时提供准确的代码提示。
内容的提问来源于stack exchange,提问作者Razvan Fulea
相关产品推荐
相关产品推荐

