如何在TypeScript里使用类封装枚举来实现Java的枚举形参倒置

一、前言

首先,枚举形参倒置 这属于一个我们创造的 新词汇,大概意思是说,我们通过为枚举形参添加一些方法,来减少调用时候传入的形参个数。

🌰举个栗子

java 复制代码
long timestamp = System.currentTimeMillis();

// before
DateTimeUtil.format(timestamp, DateTimeFormatter.FULL_DATE);

// after
DateTimeFormatter.FULL_DATE.format(timestamp);

如上示例代码,我们可以在调用时候减少传入一个枚举形参的传入,写出来的代码会更加简洁好看。

还有其他好处吗?

好像没有了...

当然,我们不讨论这两种写法的好处和坏处 (评论区可以讨论) ,我们只聊实现。

二、Java 的实现

众所周知,在 Java 中,枚举本身也是类的特殊封装,而枚举项可以认为是 Java 类的静态实例常量,所以,我们很轻易的就能实现:

2.1 封装枚举类

java 复制代码
@Getter
@AllArgsConstructor
public enum DateTimeFormatter {
    /**
     * 年月日
     */
    FULL_DATE("yyyy-MM-dd"),

    /**
     * 时分秒
     */
    FULL_TIME("HH:mm:ss"),

    /**
     * 年月日时分秒
     */
    FULL_DATETIME("yyyy-MM-dd HH:mm:ss"),
    ;

    private final String value;
}

如上,我们声明这个枚举类之后,就可以为这个枚举添加一些我们需要的方法了:

2.2 添加方法

java 复制代码
@Getter
@AllArgsConstructor
public enum DateTimeFormatter {
    // 省略定义的枚举项目
    ;

    // 枚举项封装的值
    private final String value;

    /**
     * 使用这个模板格式化毫秒时间戳
     *
     * @param milliSecond 毫秒时间戳
     * @return 格式化后的字符串
     */
    public final @NotNull String format(long milliSecond) {
        return DateTimeUtil.format(milliSecond, this);
    }

    /**
     * 使用这个模板格式化当前时间
     *
     * @return 格式化后的字符串
     */
    public final @NotNull String formatCurrent() {
        return format(System.currentTimeMillis());
    }
}

2.3 调用示例

所以封装完毕之后,我们就可以用这两个方法来实现本文提到的 枚举形参倒置 了:

三、TypeScript 的实现

可是在 TypeScript 中,枚举 并没有像 Java 那样,有 枚举封装 的特性,所以,我们只能通过 类 来实现这个功能了。可以参考我们这篇文章:TypeScript使用枚举封装和装饰器优雅的定义字典。今天我们就不赘述之前的设计了,可以先阅读之后继续下面的内容。

3.1 封装枚举类

typescript 复制代码
export class DateTimeFormatter extends AirEnum {
  static readonly FULL_DATETIME = new DateTimeFormatter(
    'yyyy-MM-dd HH:mm:ss', '年-月-日 时:分:秒'
  )
  static readonly FULL_DATE = new DateTimeFormatter(
    'yyyy-MM-dd', '年-月-日'
  )
  static readonly FULL_TIME = new DateTimeFormatter(
    'HH:mm:ss', '时-分-秒'
  )
}

我们的枚举就声明好了,当然这里的 例子🌰 其实是多余的,因为 DateTimeFormatter 这种几乎好像大概应该也许是没有什么符合字典业务场景的。

当然,为了举例,你就假设它有。

3.2 添加方法

接下来,我们也同样实现这两个方法:

typescript 复制代码
export class DateTimeFormatter extends AirEnum<string> {
  // 一些静态枚举项目

  /**
   * 格式化毫秒时间戳
   * @param timestamp 毫秒时间戳
   */
  format(timestamp: number) {
    return AirDateTime.formatFromMilliSecond(timestamp)
  }

  /**
   * 格式化当前时间
   */
  formatCurrent() {
    return AirDateTime.formatFromMilliSecond(Date.now().valueOf())
  }
}

如上,我们实现了和 Java 一样的方法,然后就可以在调用的时候使用这个方法了:

3.3 调用示例

四、总结

本文通过类的封装,来实现了枚举功能以及 枚举形参倒置 的功能,虽然大概可能没什么用。

但我还是建议你先读 TypeScript使用枚举封装和装饰器优雅的定义字典 这个文章。

今天周五,祝大家双休。

Bye。

相关推荐
神仙别闹6 分钟前
基于 Java GUI 贪心策略直接搜索算法和极大极小博弈树算法的智能人机博弈五子棋游戏
java·毕业设计·gui·贪心策略·极大极小博弈树
江华森13 分钟前
全链路可观测落地记:kube-prometheus-stack 在 K3s 上的 8 个坑与一整套修复脚本
前端
deli00726 分钟前
27 寸 4K 开 125% 为什么发虚?PPI 和缩放一次算清
前端
广州华水科技35 分钟前
当大坝面临风险时,如何有效实施单北斗GNSS变形监测?
前端
Flynn Liang1 小时前
RAG 评估体系:黄金集、检索指标与 LLM-as-Judge 落地
java·langchain·rag·评估·langchain4j·检索指标
AiMan2 小时前
Poe还是不可以导出左侧所有对话,只能单条内容导出,方法不对吗
前端
AiMan2 小时前
文心生成的内容能否下载吗?
前端
SimonKing2 小时前
Workbuddy太占C盘空间了,写个迁移工具迁走10G的数据
java·后端·程序员
前端双越老师3 小时前
程序员 1v1 访谈系列第十四期:接受焦虑 拥抱不确定
前端·ai编程·全栈
Hvitur3 小时前
Java - Lambda
java·开发语言·python