【问题标题】:Enums vs Constant differences on Typescript枚举与打字稿上的常量差异
【发布时间】:2020-02-13 09:25:11
【问题描述】:

如果我需要使用 const 变量,我会使用这种方法,因为它具有类型安全性。

export class LocalStorage {
    static USER_INFO = "user-info";
    static PROFILE_INFO = "profile-info";   
}

但似乎我们可以像这样使用string enums

export enum LocalStorage {
    USER_INFO = "user-info";
    PROFILE_INFO = "profile-info";   
 } 

这两种方法有什么区别?

【问题讨论】:

  • 我会说一个枚举,因为它更能表达为什么你需要它。具有静态属性的类不是不言自明的。但正确的方法也可能有所不同。
  • 你不能让函数接受类的静态字段。但是,它可以接收枚举的任何成员。
  • @VLAZ 这里我只需要为变量维护一个type safety
  • @Sampath 好的,所以哪个更类型安全:a) 枚举 myVar: LocalStorage 或 b) 静态字符串 myVar: string
  • enum 是常量的逻辑分组。假设您想使用不同的颜色。然后你让颜色枚举由所有定义的颜色值组成。假设帐户类型包括当前值、储蓄值、贷款值、经常性值。它的逻辑分组。 常量你可以定义任何东西。现在您必须确保您的枚举名称与逻辑分组有关?枚举名称是 LocalStorage,但下面的值不能证明为枚举

标签: typescript enums


【解决方案1】:

我同意@VLAZ,最好的方法肯定会有所不同。使用枚举的最大好处可能是能够提高函数的类型安全性。

export enum LocalStorage {
    USER_INFO = "user-info",
    PROFILE_INFO = "profile-info"
} 

function doSomething(l: LocalStorage) {
}

doSomething("foo"); // error, "foo" is not LocalStorage
doSomething("user-info"); // error, "user-info" is not LocalStorage
doSomething(LocalStorage.USER_INFO); // compiles

总体而言,枚举提供了改进的类型安全性(在它们有意义的地方),并且使用新成员扩展它们通常更简单。

【讨论】:

  • 我喜欢当前的两个答案。我认为这个方法在 99.528% 的情况下是更好的方法,但它的包装方式很有趣,所以我也喜欢 @ethane 的答案。
  • 这里最令我惊讶的结果是error, "user-info" is not LocalStorage
【解决方案2】:

虽然这两种方法都可以完成简单场景的工作。将构造用于预期目的始终是一种很好的做法。

您的班级可能会在不经意间演变成不仅仅是持有statics 的东西。导致担忧的融合。例如,将来您可能认为有必要为本地存储、indexedDB 或 cookie 添加 CRUD 函数。

那么问题就在于使用const enums 或仅使用enums。

如果您在运行时需要已编译的 enum,则使用常规 TS enum。否则,const enum 的存在只是为了帮助确保类型安全、生成更少的代码和最小化间接访问,但没有运行时查找值。

【讨论】:

    【解决方案3】:

    enum 是常量的逻辑分组。假设您想使用不同的颜色。然后你让颜色枚举由所有定义的颜色值组成。假设 accountType 包含当前值、储蓄值、贷款值、经常性值。它的逻辑分组。 常量你可以为任何东西定义。

    现在您必须确保您的枚举名称与逻辑分组有关?

    在您的情况下,Enum 名称是 LocalStorage,但下面的值不能证明为枚举

    【讨论】:

      猜你喜欢
      • 2017-03-06
      • 2017-06-20
      • 1970-01-01
      • 2020-04-30
      • 2017-05-09
      • 1970-01-01
      • 2020-10-27
      • 2020-01-29
      • 1970-01-01
      相关资源
      最近更新 更多