列舉物件和具有“字串”鍵和“數字”值的常規物件有什么區別?
// 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
顯然,列舉被轉換為非常復雜的代碼。我想知道這樣做有什么好處。
uj5u.com熱心網友回復:
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"
有時有用,有時沒用。
uj5u.com熱心網友回復:
是,有一點不同
這是示例
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 中時,您可以轉向其他語法。
uj5u.com熱心網友回復:
列舉通常具有一個字串值和一個與該字串值相關的數值。
在 TS 中,您可以決議1intoRole.READ_ONLY_USER和'READ_ONLY_USER'into Role.READ_ONLY_USER。
隨著 TS 轉換為 JavaScript,生成的代碼需要某種資料格式來存盤這些關系。
最簡單的方法是生成一個包含兩者的物件:
- 帶有字串值的數字鍵;
- 具有數值的字串鍵。
然后,Role[1]將回傳'READ_ONLY_USER'。
因此,簡而言之,數字鍵的存在允許將數字轉換為列舉值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/504501.html
標籤:javascript 打字稿 目的 枚举
