typescript - 我应该如何在 typescript 中进行枚举比较

标签 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 使这一切成为现实。

最佳答案

这里的问题是字符串枚举没有初始化。只要您的枚举未定义为 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 存储库中最近合并的拉取请求 ( PR#11218 ) 修复了 React 的这个问题,并强制生成器始终初始化字符串枚举。

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

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

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

关于typescript - 我应该如何在 typescript 中进行枚举比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60415624/

相关文章:

java - Jhipster - MySQL java.sql.SQLException : Access denied for user 'root' @'localhost' (using password: NO) 错误

java - 生成的 jhipster 项目出现错误

javascript - 从响应中获取数组而不是对象

json - Angular 2+ - 将 JSON 解析为数字

从 Angular 7 迁移后,Angular 8 无法构建

c# - Unity 在向 OWIN 添加 Active Directory 访问权限时尝试实例化枚举参数

java - 如何使用 java 在 sql 中使用 ENUM 类型

java - 如何在 Angular 5中未经授权使用主页中的实体数据

TypeScript 编译器 (tsc) 无法识别导入别名

string - 在 Rust 中匹配 Option 静态字符串文字