我正在使用NGRX存储的Angular 7应用程序上工作。我们有很多实体,几乎每个实体都有专用的列表视图。我想尝试使用NGRX存储的泛型,因此我不需要编写几乎相同的选择器,动作,缩减器等。我从动作开始,创建了一个可以返回一组动作的函数,但我无法使其正常工作
// For type safety
enum AddTypeNames {
ADD_REQUEST = 'AddRequestAction',
ADD_SUCCESS = 'AddSuccessAction',
ADD_FAILURE = 'AddFailureAction',
}
// Creates an object literal with a string key and Action as the value
function createAddActions<T>(featureName: string): { [key in AddTypeNames]: Action } {
class AddRequestAction implements Action {
readonly type = `[${featureName}] Add request`;
constructor(payload: { entity: T }) { }
}
class AddSuccessAction implements Action {
readonly type = `[${featureName}] Add success`;
constructor(payload: { entity: T }) { }
}
class AddFailureAction implements Action {
readonly type = `[${featureName}] Add error`;
constructor(payload: { error: HttpErrorResponse }) { }
}
return {
AddRequestAction,
AddSuccessAction,
AddFailureAction,
};
}
但是它在编辑器中显示错误:
(property) AddRequestAction: Action
Property 'type' is missing in type 'typeof AddRequestAction' but required in type 'Action'.ts(2741)
我不知道此错误的真正含义,因为显然我在类中确实有类型……我什至以正确的方式这样做了吗?要创建具有泛型类型的动作,我需要做什么?尽可能多地使用泛型实际上是一种好习惯吗?
答案 0 :(得分:1)
存在编译错误,因为您声明createAddActions
将返回操作{ [key in AddTypeNames]: Action }
。但是这种语法意味着Action类实例的对象,而不是类。
因此,您告诉TS,返回对象值包含属性'type',您的类没有静态属性type
。
如果要声明函数的结果是带有类的对象(不是其实例,请使用以下语法:{ new (...args): Action }
。
所以:
function createAddActions<T>(featureName: string): { [key in AddTypeNames]: { new (...args): Action } } {
不会引发编译错误。