我应该如何在打字稿中进行枚举比较

时间:2020-02-26 14:00:44

标签: typescript enums jhipster

我有一个jhipster项目,他们只是从这个机会中获得了枚举:

export enum DeclarationStatus {
  NEW = 'NEW',
  DRAFT = 'DRAFT',
  APPROVED_BY_FREELANCER = 'APPROVED_BY_FREELANCER',
  APPROVED_BY_CLIENT = 'APPROVED_BY_CLIENT',
  APPROVED = 'APPROVED'
}

对此:

export enum DeclarationStatus {
  NEW,
  DRAFT,
  APPROVED_BY_FREELANCER,
  APPROVED_BY_CLIENT,
  APPROVED
}

首先,我可以进行如下比较:

status === DeclarationStatus.APPROVED_BY_FREELANCER;

但是现在不起作用了,因为枚举实际上是一个数字。无论如何,这确实有效:

DeclarationStatus[''+status] === DeclarationStatus.APPROVED_BY_FREELANCER;

所以我的问题是哪个更好。或者甚至还有第三个选择?


我将此问题设置为回答。 Jhipster社区将更改恢复为已初始化。因此,再次比较就容易了。

感谢实现这一目标的@vicpermir。

1 个答案:

答案 0 :(得分:4)

这里的问题是字符串枚举未初始化。只要您的枚举未定义为const,您就可以与旧方法进行非常相似的比较。

status === DeclarationStatus[DeclarationStatus.APPROVED_BY_FREELANCER];

换句话说,以下应该起作用:

enum Initialized {
    A = 'A',
    B = 'B'
}

enum NotInitialized { // equivalent to
    A,                // A = 0,
    B                 // B = 1
}

status = 'A';

// String enum initialized
let test1 = (status === Initialized.A); // true

// String enum not initialized
let test2 = (status === NotInitialized.A); // false
let test3 = (status === NotInitialized[NotInitialized.A]); // true :)

JHipster Generator的官方github仓库中,有一个最近合并的pull请求(PR#11218),该请求为React解决了这个问题,并强制生成器始终初始化字符串枚举。

请记住,如JDL docs中所述,您也可以强制执行此初始化:

enum DeclarationStatus {
   NEW (NEW),
   DRAFT (DRAFT)
}

有关TypeScript枚举的更多信息,请参见here