枚举和具有"字符串"键和"数字"值对的对象之间的区别



枚举对象和具有"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'

因此,简而言之,数字键的存在允许将数字转换为枚举值。

最新更新