Flo*_*geb 22 javascript enums object typescript
我试图通过枚举访问地图的值,并为其中的所有字符串创建一个翻译就绪的应用程序.两个问题都重叠,我必须决定使用枚举还是只使用JSON格式的对象.
那么枚举和对象之间的区别和用途到底是什么?
例如:
const enum FieldNames {
FirstField: "Field One",
SecondField: "Field Two"
};
someFieldArray[FieldNames.FirstField].label = FieldNames.FirstField;
someFieldArray[FieldNames.SecondField].label = FieldNames.SecondField;
Run Code Online (Sandbox Code Playgroud)
const FieldNames = {
FirstField: "Field One",
SecondField: "Field Two"
};
someFieldArray[FieldNames.FirstField].label = FieldNames.FirstField;
someFieldArray[FieldNames.SecondField].label = FieldNames.SecondField;
Run Code Online (Sandbox Code Playgroud)
我真的没有从简单对象中选择枚举的好处.在我看来,一个对象有更多的好处,没有任何缺点.
Fen*_*ton 25
如果您需要以下功能,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';
Run Code Online (Sandbox Code Playgroud)
重要的是,您不能将枚举成员和类型分配给枚举成员,而不是字符串.
另外,因为您const enum
在示例中使用了a ,所以枚举在运行时不会存在,并且所有引用都将替换文字值(如果您使用了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';
Run Code Online (Sandbox Code Playgroud)
如果您不需要完整的枚举,但想要限制值,则可以使用文字值的并集:
type FieldNames = "Field One" | "Field Two";
let x: FieldNames;
x = "Field One";
x = "Field Two";
// Error - not allowed
x = "Field Three";
Run Code Online (Sandbox Code Playgroud)
小智 14
我不同意@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';
Run Code Online (Sandbox Code Playgroud)
function (foo: FieldNames) { }
Run Code Online (Sandbox Code Playgroud)
如果FieldNames
是一个对象,这意味着该函数需要一个具有属性FirstField
和的实例SecondField
.如果FieldNames
是枚举(在这种情况下它应该是单数,而不是复数),这意味着函数需要其中一个值FieldNames
,即"Field One"
或"Field Two"
.
用法差异很大.