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

How should I do an Enum comparison in typescript

我有一个 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 让这一切成为现实。

这里的问题是字符串枚举没有初始化。只要您的枚举未定义为 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 there is a recently merged pull request (PR#11218 的官方 github 存储库中修复了 React 的这个问题并强制生成器始终初始化字符串枚举。

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

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

可以找到有关 TypeScript 枚举的更多信息 here