枚举对象和具有"string"键和"number"值的常规对象之间有什么区别?
// THIS IS TYPESCRIPT CODE
enum Role { ADMIN, READ_ONLY_USER, FINANCES } // enum
const Role_alt = { ADMIN : 0, READ_ONLY_USER : 1, FINANCES : 2 } // object with 'string' keys and 'number' values
console.log(Role.FINANCES) // <- 2
console.log(Role_alt.FINANCES) // <- 2
它被传输到这个JS:
var Role; //
(function (Role) { //
Role[(Role["ADMIN"] = 0)] = "ADMIN"; // object declared as enum in TS
Role[(Role["READ_ONLY_USER"] = 1)] = "READ_ONLY_USER"; //
Role[(Role["FINANCES"] = 2)] = "FINANCES"; //
})(Role || (Role = {})); //
var Role_alt = { ADMIN: 0, READ_ONLY_USER: 1, FINANCES: 2 }; // object with 'string' keys and 'number' values
console.log(Role.FINANCES); // <- 2
console.log(Role_alt.FINANCES); // <- 2
显然,枚举被转换为许多复杂的代码。我想知道这有什么好处。
enum Role { ADMIN, READ_ONLY_USER, FINANCES } // enum
const Role_alt = { ADMIN : 0, READ_ONLY_USER : 1, FINANCES : 2 } // object with 'string' keys and 'number' values
console.log(Role.FINANCES) // <- 2
console.log(Role_alt.FINANCES) // <- 2
好吧,因为你也可以这样做,而你不能用普通的物体:
Role[2] // "FINANCES"
有时有用,有时不有用。
是的,存在差异
这是的例子
enum Value {
No = 0,
Yes = 1,
}
function demo(response: Value): void {
//
}
但如果是const
const ValueConst {
No: 0,
Yes: 1,
}
function demo(response: typeof ValueConst): void {
// have to use `typeof`, otherwise you get an Error
// 'ValueConst' refers to a value, but is being used as a type here. Did you mean 'typeof ValueConst'?
}
枚举也是只读
ValueConst.No = 1 // enables assignment (Not good)
Value.No = 1 // Cannot assign to 'No' because it is a read-only property.
从文档
支持这种格式的最大参数是TypeScript的枚举它使您的代码库与JavaScript的状态保持一致,当/如果枚举被添加到JavaScript中,则可以移动到附加语法。
在TS中,可以将1
解析为Role.READ_ONLY_USER
,将'READ_ONLY_USER'
解析为Role.READ_ONLY_USER
TS转换为JavaScript时,生成的代码需要某种存储这些关系的数据格式。
最简单的方法是生成一个同时包含以下两者的对象:
- 具有字符串值的数字键
- 具有数值的字符串键
然后,Role[1]
将返回'READ_ONLY_USER'
。
因此,简而言之,数字键的存在允许将数字转换为枚举值。