枚举作为打字稿中的通用类型

时间:2020-09-07 17:02:03

标签: typescript redux enums

我想声明一个类型为enum的成员的接口,如-任何enum一样。这里的想法是比说any更加安全,但仍然对将来的enum类型开放。

用例: 我正在为redux定义一个操作界面,并且我希望BaseAction界面是这样的:

export interface BaseAction {
  type: enum;  //this gives an error
  payload: any;
}

是否有一种方法可以声明成员的类型为any,只要它是enum

这样,将来我可以定义一下:

export enum SpecificActionType {
  SPECIFIC_1 = "SPECIFIC_ACTION_1",
  SPECIFIC_2 = "SPECIFIC_ACTION_2",
}

export interface SpecificAction1 extends BaseAction {
  type: SpecificActionType.SPECIFIC_1;
  payload: {
    id;
  };
}

作为免责声明,我是redux和Typescript的新手,但是正在寻找一种对开发人员友好的,严谨的,面向未来的范例。如果您有更好的主意,我也愿意接受。

2 个答案:

答案 0 :(得分:1)

基本上不是通用类型,而是基本类型。不幸的是,打字稿无法使您执行此操作。要提供这种类型的可扩展性,您需要:

每次都重新定义界面

export interface BaseAction {
  type: SpecificActionEnum | OtherActionEnum;  
  payload: any;
}

使用anyunknown类型。

答案 1 :(得分:0)

您可以添加通用类型,但不能真正强制它必须是枚举(AFAIK)。但是枚举的repr至少必须是字符串或数字。

因此,与任何类型的编译时类型检查相比,它实际上是类型更多的 annotation ,但它可以使代码更清晰:

export interface BaseAction<T extends string | number> {
  type: T;
  payload: any;
}

export enum SpecificActionType {
  SPECIFIC_1 = "SPECIFIC_ACTION_1",
  SPECIFIC_2 = "SPECIFIC_ACTION_2",
}

export interface SpecificAction1 extends BaseAction<SpecificActionType> {
  type: SpecificActionType.SPECIFIC_1;
  payload: {
    id: number;
  };
}

Playground Link