Typescript 上的枚举与常量差异

问题描述 投票:0回答:3

如果我需要使用 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";   
 } 

这两种方法有什么区别?

typescript enums
3个回答
18
投票

我同意@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

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


11
投票

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

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

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


8
投票

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

你的班级可能会无意中演变为不仅仅是持有

static
的东西。导致担忧的融合。例如,将来您可能认为有必要为本地存储、indexedDB 或 cookies 添加 CRUD 功能。

然后您可以选择

const enum
enum

如果您需要在运行时编译的

enum
,请使用常规 TypeScript
enum

A

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

编辑:如果 https://www.typescriptlang.org/tsconfig/#isolatedModules 是 tsconfig 中的

true
,那么编译器将发出 const 枚举,就好像它们是常规枚举一样。简而言之,这有助于提高单文件转译器的兼容性,因为单文件转译器一次只查看一个文件,因此无法完全查看所有文件。

© www.soinside.com 2019 - 2024. All rights reserved.