Typescript 上的枚举与常量差异

Sam*_*ath 12 enums typescript

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

export class LocalStorage {
    static USER_INFO = "user-info";
    static PROFILE_INFO = "profile-info";   
}
Run Code Online (Sandbox Code Playgroud)

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

export enum LocalStorage {
    USER_INFO = "user-info";
    PROFILE_INFO = "profile-info";   
 } 
Run Code Online (Sandbox Code Playgroud)

这两种方法有什么区别?

vip*_*tel 9

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

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

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


eth*_*ane 8

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

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

然后您可以在const enums 或enums 之间进行选择。

如果您需要在运行时编译enum,请使用常规 TypeScript enum

A 的const enum存在只是为了帮助类型安全。它的用法被内联,并const enum在编译期间被丢弃。


Col*_*inD 5

我同意@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
Run Code Online (Sandbox Code Playgroud)

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