Skip to content

枚举和Javascript对象的区别

你可能想知道在Javascript中使用枚举相对于使用对象有什么好处。这是因为两者都可以解决类似的问题,比如定义有限的选项数量,为本身不太清晰的值命名等。

验证

让我们看看下面使用对象的例子:

ts
const Transmission = {
  Automatic: 'automatic',
  Manual: 'manual',
};

Transmission.Automatic = 'electric'; // 🙃 没有验证

let transmission: string;
transmission = Transmission.Automatic; // 'automatic'
transmission = Transmission.Manual; // 'manual' 
transmission = 'electric'; // 'electric' - 🙃 没有验证

从例子中可以看出,使用对象可以方便地为我们分配默认值,但它不允许我们验证分配的内容是否在先前定义的有限值内。

现在让我们看看使用枚举的例子:

ts
enum Transmission {
  Automatic = 'automatic', 
  Manual = 'manual',
}

// ❌ 无法分配到 'Automatic',因为它是一个只读属性。
Transmission.Automatic = 'electric';

let transmission: Transmission;  
transmission = Transmission.Automatic; // 'automatic'
transmission = Transmission.Manual; // 'manual'

// ❌ 类型 '"electric"' 不能分配给类型 'Transmission'
transmission = 'electric';

使用枚举时,我们将可用选项的验证委托给Typescript。这可以在开发阶段为我们提供有用的错误消息。