打字稿中的枚举和对象有什么区别

新手上路,请多包涵

我正在尝试通过枚举访问地图的值,并为其中的所有字符串制作一个翻译就绪的应用程序。这两个问题重叠,我必须决定是使用枚举还是仅使用 JSON 格式的对象。

那么枚举和对象之间到底有什么区别和用途呢?

例如:

  • 我可以使用枚举来访问数组以及插入标签和其他类似的东西
 const enum FieldNames {
  FirstField: "Field One",
  SecondField: "Field Two"
};

someFieldArray[FieldNames.FirstField].label = FieldNames.FirstField;
someFieldArray[FieldNames.SecondField].label = FieldNames.SecondField;
  • 或者我可以通过对象实现相同的行为
 const FieldNames = {
  FirstField: "Field One",
  SecondField: "Field Two"
};

someFieldArray[FieldNames.FirstField].label = FieldNames.FirstField;
someFieldArray[FieldNames.SecondField].label = FieldNames.SecondField;

我真的没有得到选择枚举而不是简单对象的好处。在我看来,一个对象有更多的好处而没有任何缺点。

原文由 Florian Leitgeb 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 550
2 个回答

枚举

如果您想要以下功能,枚举可能会给您带来额外的好处:

 const enum FieldNamesEnum {
  FirstField = "Field One",
  SecondField = "Field Two"
};

let x: FieldNamesEnum;

x = FieldNamesEnum.FirstField;
x = FieldNamesEnum.SecondField;

// Error - not assignable to FieldNames
x = 'str';

// Cannot assign
FieldNamesEnum.FirstField = 'str';

重要的是,您不能分配给枚举成员,类型会检查给枚举成员,而不是字符串。

此外,因为您在示例中使用了 const enum ,枚举在运行时将不存在,并且所有引用都将替换为文字值(如果您使用普通的 enum 枚举 在运行时存在)。

目的

将此与对象示例进行比较:

 const FieldNames = {
  FirstField: "Field One",
  SecondField: "Field Two"
};

let y: string;

y = FieldNames.FirstField;
y = FieldNames.SecondField;

// Oops it works
y = 'str';

// Oops it works

FieldNames.FirstField = 'str';

联盟

如果不需要完整的枚举,但想限制值,则可以使用文字值的并集:

 type FieldNames = "Field One" | "Field Two";

let x: FieldNames;

x = "Field One";
x = "Field Two";

// Error - not allowed
x = "Field Three";

原文由 Fenton 发布,翻译遵循 CC BY-SA 3.0 许可协议

我不同意@Fenton。对象是类型安全的。

 const FieldNames = {
  FirstField: 'Field One',
  SecondField: 'Field Two',
} as const;

type ValueOf<T> = T[keyof T];
let y: ValueOf<typeof FieldNames>;

y = FieldNames.FirstField;
y = FieldNames.SecondField;

// TS2322: Type '"str"' is not assignable to type '"Field One" | "Field Two"'.
y = 'str';

// TS2540: Cannot assign to 'FirstField' because it is a read-only property
FieldNames.FirstField = 'str';

原文由 Martynas Skučas 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题