如何在ngrx操作中正确使用泛型

时间:2019-03-24 17:43:34

标签: typescript ngrx

我正在使用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)

我不知道此错误的真正含义,因为显然我在类中确实有类型……我什至以正确的方式这样做了吗?要创建具有泛型类型的动作,我需要做什么?尽可能多地使用泛型实际上是一种好习惯吗?

1 个答案:

答案 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 } } {

不会引发编译错误。

Playground