我试图通过enum访问 map 的值,并为其中的所有字符串制作一个翻译就绪的应用程序.

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

例如:

  • 我可以使用枚举来访问数组,也可以插入标签和其他类似的东西

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;

比起简单的对象,我真的没有得到 Select 枚举的好处.在我看来,一件物品有更多的好处,没有任何坏处.

推荐答案

Enum

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

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,则枚举would在运行时存在).

Object

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

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';

Union

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

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

let x: FieldNames;

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

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

Typescript相关问答推荐

为什么当类类型与方法参数类型不兼容时,该函数可以接受类类型

当类型不能undefined时,如何使编译器抛出错误?

为什么当我试图从数据库预填充时,属性x不存在于类型{错误:字符串; }.ts(2339)上?

如何根据服务响应构建子路由

为什么文字必须硬编码才能在TypScript中工作?

交叉点对数字和布尔的处理方式不同

错误:note_modules/@types/note/globals.d.ts:72:13 -错误TS 2403:后续变量声明必须具有相同的类型

如何使用另一个类型的属性中的类型

参数类型undefined不能分配给参数类型字符串|未定义

在这种情况下,如何获得类型安全函数的返回值?

在使用Typescribe时,是否有一种方法可以推断映射类型的键?

如何编写一个类型脚本函数,将一个对象映射(转换)为另一个对象并推断返回类型?

是否使用非显式名称隔离在对象属性上声明的接口的内部类型?

如何使默认导出与CommonJS兼容

从子类构造函数推断父类泛型类型

在Typescript 中,有没有`index=unfined的速记?未定义:某个数组[索引]`?

在类型脚本中创建泛型类型以动态追加属性后缀

尽管对象的类型已声明,但未解析的变量<;变量

为什么TypeScrip不能解析对象析构中的赋值?

如果判断空值,则基本类型Gaurd不起作用