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

tib*_*ibi 3 enums typescript jhipster

我有一个 jhipster 项目,他们只是从中偶然得到了枚举:

export enum DeclarationStatus {
  NEW = 'NEW',
  DRAFT = 'DRAFT',
  APPROVED_BY_FREELANCER = 'APPROVED_BY_FREELANCER',
  APPROVED_BY_CLIENT = 'APPROVED_BY_CLIENT',
  APPROVED = 'APPROVED'
}
Run Code Online (Sandbox Code Playgroud)

对此:

export enum DeclarationStatus {
  NEW,
  DRAFT,
  APPROVED_BY_FREELANCER,
  APPROVED_BY_CLIENT,
  APPROVED
}
Run Code Online (Sandbox Code Playgroud)

首先我可以做这样的比较:

status === DeclarationStatus.APPROVED_BY_FREELANCER;
Run Code Online (Sandbox Code Playgroud)

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

DeclarationStatus[''+status] === DeclarationStatus.APPROVED_BY_FREELANCER;
Run Code Online (Sandbox Code Playgroud)

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


我设置这个问题来回答。Jhipster 社区将更改恢复为已初始化。那么比较又很容易了。

感谢@vicpermir 使这一切成为现实。

use*_*296 5

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

status === DeclarationStatus[DeclarationStatus.APPROVED_BY_FREELANCER];
Run Code Online (Sandbox Code Playgroud)

换句话说,以下内容应该有效:

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 :)
Run Code Online (Sandbox Code Playgroud)

在JHipster Generator的官方 github 存储库中,有一个最近合并的拉取请求 ( PR#11218 ),它修复了 React 的这个问题,并强制生成器始终初始化字符串枚举。

请记住,如JDL 文档中所述,您还可以强制进行此初始化:

enum DeclarationStatus {
   NEW (NEW),
   DRAFT (DRAFT)
}
Run Code Online (Sandbox Code Playgroud)

有关 TypeScript 枚举的更多信息可以在此处找到。