【问题标题】:enum as generic type in typescript枚举作为打字稿中的泛型类型
【发布时间】:2020-09-07 17:02:03
【问题描述】:

我想用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 的新手,但我正在寻找一种对开发人员友好的严格且面向未来的范例。如果你有更好的想法,我也愿意接受。

【问题讨论】:

    标签: typescript redux enums


    【解决方案1】:

    基本上不是泛型类型,而是基本类型。不幸的是,打字稿不能让你做这样的事情。要提供这种类型的可扩展性,您需要:

    每次都重新定义接口

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

    使用anyunknown 类型。

    【讨论】:

      【解决方案2】:

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

      所以这实际上是比任何类型的编译时类型检查更多的类型注解,但它可能使代码更清晰:

      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

      【讨论】:

        猜你喜欢
        • 2019-07-09
        • 2017-03-09
        • 1970-01-01
        • 2020-09-06
        • 1970-01-01
        • 2020-06-22
        • 2021-11-26
        • 2020-12-09
        • 1970-01-01
        相关资源
        最近更新 更多