Trong mã JavaScript, tôi có các enum được xác định sau:
MyMessageIds = {
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
}
Trong hàm JavaScript, tôi muốn có thể cung cấp biểu diễn chuỗi của khóa Enum [tức là "MoveID"] và trả về giá trị số nguyên của nó là 4. Vậy làm thế nào tôi có thể làm điều này?
Được hỏi ngày 17 tháng 9 năm 2016 lúc 20:46Sep 17, 2016 at 20:46
Chuckpchuckpchuckp
2631 Huy hiệu vàng2 Huy hiệu bạc15 Huy hiệu đồng1 gold badge2 silver badges15 bronze badges
3
Chỉ cần sử dụng ký hiệu khung:
var MyMessageIds = {
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
};
function getValue[key] {
return MyMessageIds[key];
}
Đã trả lời ngày 19 tháng 9 năm 2016 lúc 17:33Sep 19, 2016 at 17:33
Baaobaaobaao
68.6K16 Huy hiệu vàng131 Huy hiệu bạc187 Huy hiệu đồng16 gold badges131 silver badges187 bronze badges
1
Bạn có thể tạo một số phương thức tiện ích lấy một đối tượng [enum] tìm ra cách lấy các khóa/giá trị.
var MyMessageIds = {
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
}
function getEnumKeys[enumType] {
return Object.keys[MyMessageIds];
}
function getEnumValues[enumType] {
return getEnumKeys[enumType].map[function[key] {
return enumType[key];
}];
}
function getEnumValue[enumType, key] {
return enumType[getEnumKeys[enumType].filter[function[k] {
return key === k;
}].pop[] || ''];
}
document.body.innerHTML = '' + JSON.stringify[{
'Enum Keys' : getEnumKeys[MyMessageIds],
'Enum Vals' : getEnumValues[MyMessageIds],
'Example' : {
'MoveId' : getEnumValue[MyMessageIds, 'MoveId']
}
}, null, 4] + '
';
Bạn cũng có thể tạo đối tượng lớp của riêng mình để thể hiện một enum có các phương thức có thể tái sử dụng.
function Enum[] {
this.self = arguments[0];
}
Enum.prototype = {
keys : function[] {
return Object.keys[this.self];
},
values : function[] {
var me = this;
return this.keys[this.self].map[function[key] {
return me.self[key];
}];
},
getValueByName : function[key] {
return this.self[this.keys[this.self].filter[function[k] {
return key === k;
}].pop[] || ''];
},
getNameByValue : function[value] {
var me = this;
return this.keys[this.self].filter[function[k] {
return me.self[k] === value;
}].pop[] || null;
}
};
var MyMessageIds = new Enum[{
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
}];
document.body.innerHTML = '' + JSON.stringify[{
'Enum Keys' : MyMessageIds.keys[],
'Enum Vals' : MyMessageIds.values[],
'Example' : {
'MoveId' : MyMessageIds.getValueByName['MoveId'],
'Val[3]' : MyMessageIds.getNameByValue[3]
}
}, null, 4] + '
';
Đã trả lời ngày 19 tháng 9 năm 2016 lúc 18:11Sep 19, 2016 at 18:11
Ông Polywhirlmr. PolywhirlMr. Polywhirl
37.3K12 Huy hiệu vàng80 Huy hiệu bạc127 Huy hiệu đồng12 gold badges80 silver badges127 bronze badges
2
Enums là một trong số ít các tính năng TypeScript không phải là phần mở rộng cấp độ của JavaScript.
Enums cho phép một nhà phát triển xác định một tập hợp các hằng số được đặt tên. Sử dụng Enums có thể giúp dễ dàng ghi lại ý định hoặc tạo ra một tập hợp các trường hợp riêng biệt. TypeScript cung cấp cả enum dựa trên số và chuỗi.
Enum số
Trước tiên, chúng tôi sẽ bắt đầu với các enum số, có lẽ quen thuộc hơn nếu bạn đến từ các ngôn ngữ khác. Một enum có thể được xác định bằng cách sử dụng từ khóa
var MyMessageIds = {
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
}
function getEnumKeys[enumType] {
return Object.keys[MyMessageIds];
}
function getEnumValues[enumType] {
return getEnumKeys[enumType].map[function[key] {
return enumType[key];
}];
}
function getEnumValue[enumType, key] {
return enumType[getEnumKeys[enumType].filter[function[k] {
return key === k;
}].pop[] || ''];
}
document.body.innerHTML = '' + JSON.stringify[{
'Enum Keys' : getEnumKeys[MyMessageIds],
'Enum Vals' : getEnumValues[MyMessageIds],
'Example' : {
'MoveId' : getEnumValue[MyMessageIds, 'MoveId']
}
}, null, 4] + '
';
5.ts
enum Direction {
Up = 1,
Down,
Left,
Right,
Try
}
Ở trên, chúng tôi có một enum số trong đó
var MyMessageIds = {
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
}
function getEnumKeys[enumType] {
return Object.keys[MyMessageIds];
}
function getEnumValues[enumType] {
return getEnumKeys[enumType].map[function[key] {
return enumType[key];
}];
}
function getEnumValue[enumType, key] {
return enumType[getEnumKeys[enumType].filter[function[k] {
return key === k;
}].pop[] || ''];
}
document.body.innerHTML = '' + JSON.stringify[{
'Enum Keys' : getEnumKeys[MyMessageIds],
'Enum Vals' : getEnumValues[MyMessageIds],
'Example' : {
'MoveId' : getEnumValue[MyMessageIds, 'MoveId']
}
}, null, 4] + '
';
6 được khởi tạo với var MyMessageIds = {
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
}
function getEnumKeys[enumType] {
return Object.keys[MyMessageIds];
}
function getEnumValues[enumType] {
return getEnumKeys[enumType].map[function[key] {
return enumType[key];
}];
}
function getEnumValue[enumType, key] {
return enumType[getEnumKeys[enumType].filter[function[k] {
return key === k;
}].pop[] || ''];
}
document.body.innerHTML = '' + JSON.stringify[{
'Enum Keys' : getEnumKeys[MyMessageIds],
'Enum Vals' : getEnumValues[MyMessageIds],
'Example' : {
'MoveId' : getEnumValue[MyMessageIds, 'MoveId']
}
}, null, 4] + '
';
7. Tất cả các thành viên sau đây được tự động tăng từ thời điểm đó. Nói cách khác, var MyMessageIds = {
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
}
function getEnumKeys[enumType] {
return Object.keys[MyMessageIds];
}
function getEnumValues[enumType] {
return getEnumKeys[enumType].map[function[key] {
return enumType[key];
}];
}
function getEnumValue[enumType, key] {
return enumType[getEnumKeys[enumType].filter[function[k] {
return key === k;
}].pop[] || ''];
}
document.body.innerHTML = '' + JSON.stringify[{
'Enum Keys' : getEnumKeys[MyMessageIds],
'Enum Vals' : getEnumValues[MyMessageIds],
'Example' : {
'MoveId' : getEnumValue[MyMessageIds, 'MoveId']
}
}, null, 4] + '
';
8 có giá trị var MyMessageIds = {
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
}
function getEnumKeys[enumType] {
return Object.keys[MyMessageIds];
}
function getEnumValues[enumType] {
return getEnumKeys[enumType].map[function[key] {
return enumType[key];
}];
}
function getEnumValue[enumType, key] {
return enumType[getEnumKeys[enumType].filter[function[k] {
return key === k;
}].pop[] || ''];
}
document.body.innerHTML = '' + JSON.stringify[{
'Enum Keys' : getEnumKeys[MyMessageIds],
'Enum Vals' : getEnumValues[MyMessageIds],
'Example' : {
'MoveId' : getEnumValue[MyMessageIds, 'MoveId']
}
}, null, 4] + '
';
7, function Enum[] {
this.self = arguments[0];
}
Enum.prototype = {
keys : function[] {
return Object.keys[this.self];
},
values : function[] {
var me = this;
return this.keys[this.self].map[function[key] {
return me.self[key];
}];
},
getValueByName : function[key] {
return this.self[this.keys[this.self].filter[function[k] {
return key === k;
}].pop[] || ''];
},
getNameByValue : function[value] {
var me = this;
return this.keys[this.self].filter[function[k] {
return me.self[k] === value;
}].pop[] || null;
}
};
var MyMessageIds = new Enum[{
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
}];
document.body.innerHTML = '' + JSON.stringify[{
'Enum Keys' : MyMessageIds.keys[],
'Enum Vals' : MyMessageIds.values[],
'Example' : {
'MoveId' : MyMessageIds.getValueByName['MoveId'],
'Val[3]' : MyMessageIds.getNameByValue[3]
}
}, null, 4] + '
';
0 có function Enum[] {
this.self = arguments[0];
}
Enum.prototype = {
keys : function[] {
return Object.keys[this.self];
},
values : function[] {
var me = this;
return this.keys[this.self].map[function[key] {
return me.self[key];
}];
},
getValueByName : function[key] {
return this.self[this.keys[this.self].filter[function[k] {
return key === k;
}].pop[] || ''];
},
getNameByValue : function[value] {
var me = this;
return this.keys[this.self].filter[function[k] {
return me.self[k] === value;
}].pop[] || null;
}
};
var MyMessageIds = new Enum[{
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
}];
document.body.innerHTML = '' + JSON.stringify[{
'Enum Keys' : MyMessageIds.keys[],
'Enum Vals' : MyMessageIds.values[],
'Example' : {
'MoveId' : MyMessageIds.getValueByName['MoveId'],
'Val[3]' : MyMessageIds.getNameByValue[3]
}
}, null, 4] + '
';
1, function Enum[] {
this.self = arguments[0];
}
Enum.prototype = {
keys : function[] {
return Object.keys[this.self];
},
values : function[] {
var me = this;
return this.keys[this.self].map[function[key] {
return me.self[key];
}];
},
getValueByName : function[key] {
return this.self[this.keys[this.self].filter[function[k] {
return key === k;
}].pop[] || ''];
},
getNameByValue : function[value] {
var me = this;
return this.keys[this.self].filter[function[k] {
return me.self[k] === value;
}].pop[] || null;
}
};
var MyMessageIds = new Enum[{
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
}];
document.body.innerHTML = '' + JSON.stringify[{
'Enum Keys' : MyMessageIds.keys[],
'Enum Vals' : MyMessageIds.values[],
'Example' : {
'MoveId' : MyMessageIds.getValueByName['MoveId'],
'Val[3]' : MyMessageIds.getNameByValue[3]
}
}, null, 4] + '
';
2 có function Enum[] {
this.self = arguments[0];
}
Enum.prototype = {
keys : function[] {
return Object.keys[this.self];
},
values : function[] {
var me = this;
return this.keys[this.self].map[function[key] {
return me.self[key];
}];
},
getValueByName : function[key] {
return this.self[this.keys[this.self].filter[function[k] {
return key === k;
}].pop[] || ''];
},
getNameByValue : function[value] {
var me = this;
return this.keys[this.self].filter[function[k] {
return me.self[k] === value;
}].pop[] || null;
}
};
var MyMessageIds = new Enum[{
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
}];
document.body.innerHTML = '' + JSON.stringify[{
'Enum Keys' : MyMessageIds.keys[],
'Enum Vals' : MyMessageIds.values[],
'Example' : {
'MoveId' : MyMessageIds.getValueByName['MoveId'],
'Val[3]' : MyMessageIds.getNameByValue[3]
}
}, null, 4] + '
';
3 và function Enum[] {
this.self = arguments[0];
}
Enum.prototype = {
keys : function[] {
return Object.keys[this.self];
},
values : function[] {
var me = this;
return this.keys[this.self].map[function[key] {
return me.self[key];
}];
},
getValueByName : function[key] {
return this.self[this.keys[this.self].filter[function[k] {
return key === k;
}].pop[] || ''];
},
getNameByValue : function[value] {
var me = this;
return this.keys[this.self].filter[function[k] {
return me.self[k] === value;
}].pop[] || null;
}
};
var MyMessageIds = new Enum[{
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
}];
document.body.innerHTML = '' + JSON.stringify[{
'Enum Keys' : MyMessageIds.keys[],
'Enum Vals' : MyMessageIds.values[],
'Example' : {
'MoveId' : MyMessageIds.getValueByName['MoveId'],
'Val[3]' : MyMessageIds.getNameByValue[3]
}
}, null, 4] + '
';
4 có function Enum[] {
this.self = arguments[0];
}
Enum.prototype = {
keys : function[] {
return Object.keys[this.self];
},
values : function[] {
var me = this;
return this.keys[this.self].map[function[key] {
return me.self[key];
}];
},
getValueByName : function[key] {
return this.self[this.keys[this.self].filter[function[k] {
return key === k;
}].pop[] || ''];
},
getNameByValue : function[value] {
var me = this;
return this.keys[this.self].filter[function[k] {
return me.self[k] === value;
}].pop[] || null;
}
};
var MyMessageIds = new Enum[{
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
}];
document.body.innerHTML = '' + JSON.stringify[{
'Enum Keys' : MyMessageIds.keys[],
'Enum Vals' : MyMessageIds.values[],
'Example' : {
'MoveId' : MyMessageIds.getValueByName['MoveId'],
'Val[3]' : MyMessageIds.getNameByValue[3]
}
}, null, 4] + '
';
5.Nếu chúng tôi muốn, chúng tôi có thể bỏ hoàn toàn các bộ khởi tạo:
ts
enum Direction {
Up,
Down,
Left,
Right,
Try
}
Ở đây,
var MyMessageIds = {
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
}
function getEnumKeys[enumType] {
return Object.keys[MyMessageIds];
}
function getEnumValues[enumType] {
return getEnumKeys[enumType].map[function[key] {
return enumType[key];
}];
}
function getEnumValue[enumType, key] {
return enumType[getEnumKeys[enumType].filter[function[k] {
return key === k;
}].pop[] || ''];
}
document.body.innerHTML = '' + JSON.stringify[{
'Enum Keys' : getEnumKeys[MyMessageIds],
'Enum Vals' : getEnumValues[MyMessageIds],
'Example' : {
'MoveId' : getEnumValue[MyMessageIds, 'MoveId']
}
}, null, 4] + '
';
6 sẽ có giá trị function Enum[] {
this.self = arguments[0];
}
Enum.prototype = {
keys : function[] {
return Object.keys[this.self];
},
values : function[] {
var me = this;
return this.keys[this.self].map[function[key] {
return me.self[key];
}];
},
getValueByName : function[key] {
return this.self[this.keys[this.self].filter[function[k] {
return key === k;
}].pop[] || ''];
},
getNameByValue : function[value] {
var me = this;
return this.keys[this.self].filter[function[k] {
return me.self[k] === value;
}].pop[] || null;
}
};
var MyMessageIds = new Enum[{
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
}];
document.body.innerHTML = '' + JSON.stringify[{
'Enum Keys' : MyMessageIds.keys[],
'Enum Vals' : MyMessageIds.values[],
'Example' : {
'MoveId' : MyMessageIds.getValueByName['MoveId'],
'Val[3]' : MyMessageIds.getNameByValue[3]
}
}, null, 4] + '
';
7, function Enum[] {
this.self = arguments[0];
}
Enum.prototype = {
keys : function[] {
return Object.keys[this.self];
},
values : function[] {
var me = this;
return this.keys[this.self].map[function[key] {
return me.self[key];
}];
},
getValueByName : function[key] {
return this.self[this.keys[this.self].filter[function[k] {
return key === k;
}].pop[] || ''];
},
getNameByValue : function[value] {
var me = this;
return this.keys[this.self].filter[function[k] {
return me.self[k] === value;
}].pop[] || null;
}
};
var MyMessageIds = new Enum[{
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
}];
document.body.innerHTML = '' + JSON.stringify[{
'Enum Keys' : MyMessageIds.keys[],
'Enum Vals' : MyMessageIds.values[],
'Example' : {
'MoveId' : MyMessageIds.getValueByName['MoveId'],
'Val[3]' : MyMessageIds.getNameByValue[3]
}
}, null, 4] + '
';
0 sẽ có var MyMessageIds = {
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
}
function getEnumKeys[enumType] {
return Object.keys[MyMessageIds];
}
function getEnumValues[enumType] {
return getEnumKeys[enumType].map[function[key] {
return enumType[key];
}];
}
function getEnumValue[enumType, key] {
return enumType[getEnumKeys[enumType].filter[function[k] {
return key === k;
}].pop[] || ''];
}
document.body.innerHTML = '' + JSON.stringify[{
'Enum Keys' : getEnumKeys[MyMessageIds],
'Enum Vals' : getEnumValues[MyMessageIds],
'Example' : {
'MoveId' : getEnumValue[MyMessageIds, 'MoveId']
}
}, null, 4] + '
';
7, v.v. enum.Sử dụng enum rất đơn giản: Chỉ cần truy cập bất kỳ thành viên nào làm thuộc tính của chính Enum và khai báo các loại bằng tên của Enum:
ts
enum UserResponse {
No = 0,
Yes = 1,
}
function respond[recipient: string, message: UserResponse]: void {
// ...
}
Try
respond["Princess Caroline", UserResponse.Yes];
Các enum số có thể được trộn trong các thành viên được tính toán và không đổi [xem bên dưới]. Truyện ngắn là, các enum mà không cần khởi tạo hoặc cần phải là người đầu tiên hoặc phải đến sau khi các enum số được khởi tạo với các hằng số số hoặc các thành viên enum không đổi khác. Nói cách khác, những điều sau đây được cho phép:
ts
enum E {
A = getSomeValue[],
B,
Enum member must have initializer.1061Enum member must have initializer.
Try}
Chuỗi enums
Các enum chuỗi là một khái niệm tương tự, nhưng có một số khác biệt thời gian chạy tinh tế như được ghi lại dưới đây. Trong một chuỗi enum, mỗi thành viên phải được khởi tạo không đổi với một chuỗi theo nghĩa đen hoặc với một thành viên enum chuỗi khác.
ts
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
Try
}
Trong khi các enum chuỗi don don có hành vi tự động nâng cấp, các enum chuỗi có lợi ích mà họ đã tuần tự hóa tốt. Nói cách khác, nếu bạn đang gỡ lỗi và phải đọc giá trị thời gian chạy của một enum số, giá trị thường mờ đục - nó không tự nó truyền đạt bất kỳ ý nghĩa hữu ích nào [mặc dù ánh xạ ngược thường có thể giúp ích]. Các enum chuỗi cho phép bạn đưa ra một giá trị có ý nghĩa và có thể đọc được khi mã của bạn chạy, độc lập với tên của chính thành viên enum.
Enums không đồng nhất
Các enum về mặt kỹ thuật có thể được trộn lẫn với các thành viên chuỗi và số, nhưng nó không rõ lý do tại sao bạn muốn làm như vậy:
ts
enum BooleanLikeHeterogeneousEnum {
No = 0,
Yes = "YES",
Try
}
Trừ khi bạn thực sự cố gắng tận dụng hành vi thời gian chạy của JavaScript, một cách thông minh, thì bạn khuyên bạn nên làm điều này.
Thành viên được tính toán và liên tục
Mỗi thành viên enum có một giá trị liên quan đến nó có thể là hằng số hoặc được tính toán. Một thành viên enum được coi là không đổi nếu:
Đây là thành viên đầu tiên trong enum và nó không có trình khởi tạo, trong trường hợp đó, nó đã gán giá trị
7:function Enum[] { this.self = arguments[0]; } Enum.prototype = { keys : function[] { return Object.keys[this.self]; }, values : function[] { var me = this; return this.keys[this.self].map[function[key] { return me.self[key]; }]; }, getValueByName : function[key] { return this.self[this.keys[this.self].filter[function[k] { return key === k; }].pop[] || '']; }, getNameByValue : function[value] { var me = this; return this.keys[this.self].filter[function[k] { return me.self[k] === value; }].pop[] || null; } }; var MyMessageIds = new Enum[{ UndefinedId : 0, FilenameId : 1, BuildFileId : 2, MovementArgsId : 3, MoveId : 4, ExecuteCommandId : 5 }]; document.body.innerHTML = '
' + JSON.stringify[{ 'Enum Keys' : MyMessageIds.keys[], 'Enum Vals' : MyMessageIds.values[], 'Example' : { 'MoveId' : MyMessageIds.getValueByName['MoveId'], 'Val[3]' : MyMessageIds.getNameByValue[3] } }, null, 4] + '
';
0var MyMessageIds = { UndefinedId : 0, FilenameId : 1, BuildFileId : 2, MovementArgsId : 3, MoveId : 4, ExecuteCommandId : 5 }; function getValue[key] { return MyMessageIds[key]; }
Nó không có bộ khởi tạo và thành viên enum trước đó là một hằng số số. Trong trường hợp này, giá trị của thành viên enum hiện tại sẽ là giá trị của thành viên enum trước đó cộng với một thành viên.
1var MyMessageIds = { UndefinedId : 0, FilenameId : 1, BuildFileId : 2, MovementArgsId : 3, MoveId : 4, ExecuteCommandId : 5 }; function getValue[key] { return MyMessageIds[key]; }
Thành viên enum được khởi tạo với biểu thức enum không đổi. Biểu thức enum không đổi là một tập hợp các biểu thức TypeScript có thể được đánh giá đầy đủ tại thời điểm biên dịch. Một biểu thức là một biểu thức enum không đổi nếu đó là:
- một biểu thức enum theo nghĩa đen [về cơ bản là một chuỗi chữ hoặc chữ số]
- tham chiếu đến thành viên enum hằng số được xác định trước đó [có thể bắt nguồn từ một enum khác]
- một biểu hiện không đổi trong dấu ngoặc đơn
- Một trong các toán tử
1,ts
enum Direction {
Up = 1,
Down,
Left,
Right,
Try}
2,ts
enum Direction {
Up = 1,
Down,
Left,
Right,
Try}
3 được áp dụng cho biểu thức enum không đổits
enum Direction {
Up = 1,
Down,
Left,
Right,
Try}
1,ts
enum Direction {
Up = 1,
Down,
Left,
Right,
Try}
2,ts
enum Direction {
Up = 1,
Down,
Left,
Right,
Try}
6,ts
enum Direction {
Up = 1,
Down,
Left,
Right,
Try}
7,ts
enum Direction {
Up = 1,
Down,
Left,
Right,
Try}
8,ts
enum Direction {
Up = 1,
Down,
Left,
Right,
Try}
9,ts
enum Direction {
Up = 1,
Down,
Left,
Right,
Try}
0,ts
enum Direction {
Up,
Down,
Left,
Right,
Try}
1,ts
enum Direction {
Up,
Down,
Left,
Right,
Try}
2,ts
enum Direction {
Up,
Down,
Left,
Right,
Try}
3, ______54ts
enum Direction {
Up,
Down,
Left,
Right,
Try}
Đó là một lỗi thời gian biên dịch cho các biểu thức enum không đổi được đánh giá thành
5 hoặcts
enum Direction {
Up,
Down,
Left,
Right,
Try}
6.ts
enum Direction {
Up,
Down,
Left,
Right,
Try}
Trong tất cả các trường hợp khác, thành viên enum được coi là tính toán.
var MyMessageIds = {
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
};
function getValue[key] {
return MyMessageIds[key];
}
2Liên minh enum và các loại thành viên enum
Có một tập hợp con đặc biệt của các thành viên enum liên tục mà aren tính toán: các thành viên enum theo nghĩa đen. Thành viên enum theo nghĩa đen là thành viên enum không đổi không có giá trị khởi tạo hoặc với các giá trị được khởi tạo thành
- Bất kỳ chuỗi nào theo nghĩa đen [ví dụ:
7,ts
enum Direction {
Up,
Down,
Left,
Right,
Try}
8,ts
enum Direction {
Up,
Down,
Left,
Right,
Try}
9]ts
enum Direction {
Up,
Down,
Left,
Right,
Try}
- Bất kỳ chữ số nào [ví dụ:
7,var MyMessageIds = { UndefinedId : 0, FilenameId : 1, BuildFileId : 2, MovementArgsId : 3, MoveId : 4, ExecuteCommandId : 5 } function getEnumKeys[enumType] { return Object.keys[MyMessageIds]; } function getEnumValues[enumType] { return getEnumKeys[enumType].map[function[key] { return enumType[key]; }]; } function getEnumValue[enumType, key] { return enumType[getEnumKeys[enumType].filter[function[k] { return key === k; }].pop[] || '']; } document.body.innerHTML = '
' + JSON.stringify[{ 'Enum Keys' : getEnumKeys[MyMessageIds], 'Enum Vals' : getEnumValues[MyMessageIds], 'Example' : { 'MoveId' : getEnumValue[MyMessageIds, 'MoveId'] } }, null, 4] + '
';
1]ts
enum UserResponse {
No = 0,
Yes = 1,
}
function respond[recipient: string, message: UserResponse]: void {
// ...
}
Tryrespond["Princess Caroline", UserResponse.Yes];
- Một điểm trừ đơn giản áp dụng cho bất kỳ chữ số nào [ví dụ:
2,ts
enum UserResponse {
No = 0,
Yes = 1,
}
function respond[recipient: string, message: UserResponse]: void {
// ...
}
Tryrespond["Princess Caroline", UserResponse.Yes];
3]ts
enum UserResponse {
No = 0,
Yes = 1,
}
function respond[recipient: string, message: UserResponse]: void {
// ...
}
Tryrespond["Princess Caroline", UserResponse.Yes];
Khi tất cả các thành viên trong một enum có các giá trị enum theo nghĩa đen, một số ngữ nghĩa đặc biệt xuất hiện.
Đầu tiên là các thành viên Enum cũng trở thành loại! Ví dụ: chúng ta có thể nói rằng một số thành viên nhất định chỉ có thể có giá trị của một thành viên enum:
var MyMessageIds = {
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
};
function getValue[key] {
return MyMessageIds[key];
}
3Thay đổi khác là bản thân các loại enum có hiệu quả trở thành một liên minh của mỗi thành viên enum. Với các enum của công đoàn, hệ thống loại có thể tận dụng thực tế là nó biết chính xác các giá trị tồn tại trong chính Enum. Do đó, TypeScript có thể bắt các lỗi nơi chúng ta có thể so sánh các giá trị không chính xác. Ví dụ:
var MyMessageIds = {
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
};
function getValue[key] {
return MyMessageIds[key];
}
4Trong ví dụ đó, trước tiên chúng tôi đã kiểm tra xem
4 không phải làts
enum UserResponse {
No = 0,
Yes = 1,
}
function respond[recipient: string, message: UserResponse]: void {
// ...
}
Try
respond["Princess Caroline", UserResponse.Yes];
5. Nếu kiểm tra đó thành công, thìts
enum UserResponse {
No = 0,
Yes = 1,
}
function respond[recipient: string, message: UserResponse]: void {
// ...
}
Try
respond["Princess Caroline", UserResponse.Yes];
6 của chúng tôi sẽ ngắn mạch và thân máy của ‘nếu có thể chạy. Tuy nhiên, nếu séc không thành công, thìts
enum UserResponse {
No = 0,
Yes = 1,
}
function respond[recipient: string, message: UserResponse]: void {
// ...
}
Try
respond["Princess Caroline", UserResponse.Yes];
4 chỉ có thể làts
enum UserResponse {
No = 0,
Yes = 1,
}
function respond[recipient: string, message: UserResponse]: void {
// ...
}
Try
respond["Princess Caroline", UserResponse.Yes];
5, do đó, nó không có ý nghĩa gì để xem liệu nó có bằngts
enum UserResponse {
No = 0,
Yes = 1,
}
function respond[recipient: string, message: UserResponse]: void {
// ...
}
Try
respond["Princess Caroline", UserResponse.Yes];
9 hay không.ts
enum UserResponse {
No = 0,
Yes = 1,
}
function respond[recipient: string, message: UserResponse]: void {
// ...
}
Try
respond["Princess Caroline", UserResponse.Yes];
Enums khi chạy
Enums là các đối tượng thực sự tồn tại trong thời gian chạy. Ví dụ: enum sau đây
var MyMessageIds = {
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
};
function getValue[key] {
return MyMessageIds[key];
}
5thực sự có thể được truyền lại cho các chức năng
var MyMessageIds = {
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
};
function getValue[key] {
return MyMessageIds[key];
}
6Enums tại thời điểm biên dịch
Mặc dù các enum là các đối tượng thực sự tồn tại trong thời gian chạy, từ khóa ____70 hoạt động khác với bạn có thể mong đợi cho các đối tượng điển hình. Thay vào đó, hãy sử dụng
1 để có được một loại đại diện cho tất cả các khóa Enum dưới dạng chuỗi.ts
enum E {
A = getSomeValue[],
B,
Enum member must have initializer.1061Enum member must have initializer.
Try}
var MyMessageIds = {
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
};
function getValue[key] {
return MyMessageIds[key];
}
7Ánh xạ ngược
Ngoài việc tạo một đối tượng có tên thuộc tính cho các thành viên, các thành viên enum số cũng nhận được ánh xạ ngược từ các giá trị enum sang tên enum. Ví dụ, trong ví dụ này:
var MyMessageIds = {
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
};
function getValue[key] {
return MyMessageIds[key];
}
8TypeScript biên dịch điều này xuống JavaScript sau:
var MyMessageIds = {
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
};
function getValue[key] {
return MyMessageIds[key];
}
9Trong mã được tạo này, một enum được biên dịch thành một đối tượng lưu trữ cả hai ánh xạ [
2 ->ts
enum E {
A = getSomeValue[],
B,
Enum member must have initializer.1061Enum member must have initializer.
Try}
3] và ngược [ts
enum E {
A = getSomeValue[],
B,
Enum member must have initializer.1061Enum member must have initializer.
Try}
3 ->ts
enum E {
A = getSomeValue[],
B,
Enum member must have initializer.1061Enum member must have initializer.
Try}
2]. Các tài liệu tham khảo cho các thành viên ENUM khác luôn được phát ra dưới dạng quyền truy cập tài sản và không bao giờ được đưa vào.ts
enum E {
A = getSomeValue[],
B,
Enum member must have initializer.1061Enum member must have initializer.
Try}
Hãy nhớ rằng các thành viên chuỗi enum không nhận được ánh xạ ngược được tạo ra.
ts
enum E {
A = getSomeValue[],
B,
Enum member must have initializer.1061Enum member must have initializer.}
Try
6 Enums
ts
enum E {
A = getSomeValue[],
B,
Enum member must have initializer.1061Enum member must have initializer.}
TryTrong hầu hết các trường hợp, Enums là một giải pháp hoàn toàn hợp lệ. Tuy nhiên, đôi khi các yêu cầu chặt chẽ hơn. Để tránh thanh toán chi phí của mã được tạo thêm và Indirection bổ sung khi truy cập các giá trị Enum, bạn có thể sử dụng
6 Enums. Các enum const được xác định bằng cách sử dụng công cụ sửa đổits
enum E {
A = getSomeValue[],
B,
Enum member must have initializer.1061Enum member must have initializer.
Try}
6 trên enum của chúng tôi:ts
enum E {
A = getSomeValue[],
B,
Enum member must have initializer.1061Enum member must have initializer.
Try}
var MyMessageIds = {
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
}
function getEnumKeys[enumType] {
return Object.keys[MyMessageIds];
}
function getEnumValues[enumType] {
return getEnumKeys[enumType].map[function[key] {
return enumType[key];
}];
}
function getEnumValue[enumType, key] {
return enumType[getEnumKeys[enumType].filter[function[k] {
return key === k;
}].pop[] || ''];
}
document.body.innerHTML = '' + JSON.stringify[{
'Enum Keys' : getEnumKeys[MyMessageIds],
'Enum Vals' : getEnumValues[MyMessageIds],
'Example' : {
'MoveId' : getEnumValue[MyMessageIds, 'MoveId']
}
}, null, 4] + '
';
0Const enum chỉ có thể sử dụng các biểu thức enum không đổi và không giống như các enum thông thường, chúng hoàn toàn bị loại bỏ trong quá trình biên dịch. Các thành viên Const Enum được đưa vào các trang web sử dụng. Điều này là có thể vì các enum const không thể tính toán thành viên.
var MyMessageIds = {
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
}
function getEnumKeys[enumType] {
return Object.keys[MyMessageIds];
}
function getEnumValues[enumType] {
return getEnumKeys[enumType].map[function[key] {
return enumType[key];
}];
}
function getEnumValue[enumType, key] {
return enumType[getEnumKeys[enumType].filter[function[k] {
return key === k;
}].pop[] || ''];
}
document.body.innerHTML = '' + JSON.stringify[{
'Enum Keys' : getEnumKeys[MyMessageIds],
'Enum Vals' : getEnumValues[MyMessageIds],
'Example' : {
'MoveId' : getEnumValue[MyMessageIds, 'MoveId']
}
}, null, 4] + '
';
1Trong mã được tạo sẽ trở thành
var MyMessageIds = {
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
}
function getEnumKeys[enumType] {
return Object.keys[MyMessageIds];
}
function getEnumValues[enumType] {
return getEnumKeys[enumType].map[function[key] {
return enumType[key];
}];
}
function getEnumValue[enumType, key] {
return enumType[getEnumKeys[enumType].filter[function[k] {
return key === k;
}].pop[] || ''];
}
document.body.innerHTML = '' + JSON.stringify[{
'Enum Keys' : getEnumKeys[MyMessageIds],
'Enum Vals' : getEnumValues[MyMessageIds],
'Example' : {
'MoveId' : getEnumValue[MyMessageIds, 'MoveId']
}
}, null, 4] + '
';
2Const enum cạm bẫy
Các giá trị enum nội tuyến lúc đầu là đơn giản, nhưng đi kèm với ý nghĩa tinh tế. Những cạm bẫy này chỉ liên quan đến các enum const xung quanh [về cơ bản là các tệp trong các tệp
9] và chia sẻ chúng giữa các dự án, nhưng nếu bạn đang xuất bản hoặc tiêu thụ các tệp ____79, những cạm bẫy này có thể áp dụng cho bạn, vìts
enum E {
A = getSomeValue[],
B,
Enum member must have initializer.1061Enum member must have initializer.
Try}
1 chuyển đổi các tệpts
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
Try
}
2 vào các tệpts
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
Try
}
9.ts
enum E {
A = getSomeValue[],
B,
Enum member must have initializer.1061Enum member must have initializer.
Try}
- Vì những lý do được trình bày trong tài liệu
4, chế độ đó về cơ bản không tương thích với các enum const xung quanh. Điều này có nghĩa là nếu bạn xuất bản các enum const xung quanh, người tiêu dùng hạ nguồn sẽ không thể sử dụngts
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
Try}
4 và các giá trị enum đó cùng một lúc.ts
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
Try}
- Bạn có thể dễ dàng nội tuyến các giá trị từ phiên bản A của một phụ thuộc vào thời điểm biên dịch và nhập phiên bản B khi chạy. Phiên bản A và B, các enum có thể có các giá trị khác nhau, nếu bạn không cẩn thận lắm, dẫn đến các lỗi đáng ngạc nhiên, như lấy các nhánh sai của các câu lệnh
6. Những lỗi này đặc biệt nguy hiểm vì thông thường việc chạy các thử nghiệm tự động cùng lúc với các dự án được xây dựng, với cùng một phiên bản phụ thuộc, bỏ lỡ các lỗi này hoàn toàn.ts
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
Try}
7 sẽ không thực hiện nhập khẩu cho các enum const được sử dụng làm giá trị, nhưng các enum const xung quanh không đảm bảo rằng thời gian chạyts
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
Try}
8 tồn tại các tệp. Nhập khẩu không thể giải quyết được gây ra lỗi khi chạy. Cách thông thường để thực hiện nhập khẩu rõ ràng, nhập khẩu chỉ loại, hiện không cho phép các giá trị enum của const.ts
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
Try}
Dưới đây là hai cách tiếp cận để tránh những cạm bẫy này:
A. Không sử dụng enum const. Bạn có thể dễ dàng cấm các const enums với sự trợ giúp của một linter. Rõ ràng điều này tránh mọi vấn đề với enums const, nhưng ngăn dự án của bạn nội tuyến của chính nó. Không giống như các enum nội tuyến từ các dự án khác, việc nội tuyến của một dự án riêng của dự án không có vấn đề gì và có ý nghĩa về hiệu suất. B. Không xuất bản các enum const xung quanh, bằng cách giải mã chúng với sự trợ giúp của
9. Đây là cách tiếp cận được thực hiện trong nội bộ bởi chính dự án TypeScript.ts
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
Try
}
9 phát ra cùng một JavaScript cho các enum const như các enum đơn giản. Sau đó, bạn có thể loại bỏ một cách an toàn công cụ sửa đổits
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
Try
}
6 từ các tệpts
enum E {
A = getSomeValue[],
B,
Enum member must have initializer.1061Enum member must have initializer.
Try}
9 trong một bước xây dựng.ts
enum E {
A = getSomeValue[],
B,
Enum member must have initializer.1061Enum member must have initializer.
Try}
Theo cách này, người tiêu dùng hạ nguồn sẽ không liên kết với dự án của bạn, tránh những cạm bẫy ở trên, nhưng một dự án vẫn có thể in tuyến chính của mình, không giống như cấm hoàn toàn const.
Enums xung quanh
Các enum xung quanh được sử dụng để mô tả hình dạng của các loại enum đã có.
var MyMessageIds = {
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
}
function getEnumKeys[enumType] {
return Object.keys[MyMessageIds];
}
function getEnumValues[enumType] {
return getEnumKeys[enumType].map[function[key] {
return enumType[key];
}];
}
function getEnumValue[enumType, key] {
return enumType[getEnumKeys[enumType].filter[function[k] {
return key === k;
}].pop[] || ''];
}
document.body.innerHTML = '' + JSON.stringify[{
'Enum Keys' : getEnumKeys[MyMessageIds],
'Enum Vals' : getEnumValues[MyMessageIds],
'Example' : {
'MoveId' : getEnumValue[MyMessageIds, 'MoveId']
}
}, null, 4] + '
';
3Một sự khác biệt quan trọng giữa các enum môi trường xung quanh và không mơ hồ là, trong các enum thường xuyên, các thành viên không có bộ khởi tạo sẽ được coi là không đổi nếu thành viên enum trước đó được coi là không đổi. Ngược lại, một thành viên enum môi trường xung quanh [và không phải là trước] không có trình khởi tạo luôn được coi là tính toán.
Đối tượng vs Enums
Trong TypeScript hiện đại, bạn có thể không cần một enum khi một đối tượng có
3 có thể đủ:ts
enum BooleanLikeHeterogeneousEnum {
No = 0,
Yes = "YES",
Try
}
var MyMessageIds = {
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
}
function getEnumKeys[enumType] {
return Object.keys[MyMessageIds];
}
function getEnumValues[enumType] {
return getEnumKeys[enumType].map[function[key] {
return enumType[key];
}];
}
function getEnumValue[enumType, key] {
return enumType[getEnumKeys[enumType].filter[function[k] {
return key === k;
}].pop[] || ''];
}
document.body.innerHTML = '' + JSON.stringify[{
'Enum Keys' : getEnumKeys[MyMessageIds],
'Enum Vals' : getEnumValues[MyMessageIds],
'Example' : {
'MoveId' : getEnumValue[MyMessageIds, 'MoveId']
}
}, null, 4] + '
';
4Đối số lớn nhất có lợi cho định dạng này so với TypeScript,
var MyMessageIds = {
UndefinedId : 0,
FilenameId : 1,
BuildFileId : 2,
MovementArgsId : 3,
MoveId : 4,
ExecuteCommandId : 5
}
function getEnumKeys[enumType] {
return Object.keys[MyMessageIds];
}
function getEnumValues[enumType] {
return getEnumKeys[enumType].map[function[key] {
return enumType[key];
}];
}
function getEnumValue[enumType, key] {
return enumType[getEnumKeys[enumType].filter[function[k] {
return key === k;
}].pop[] || ''];
}
document.body.innerHTML = '' + JSON.stringify[{
'Enum Keys' : getEnumKeys[MyMessageIds],
'Enum Vals' : getEnumValues[MyMessageIds],
'Example' : {
'MoveId' : getEnumValue[MyMessageIds, 'MoveId']
}
}, null, 4] + '
';
5 là nó giữ cho cơ sở mã của bạn phù hợp với trạng thái của JavaScript và khi/nếu được thêm vào JavaScript thì bạn có thể chuyển sang cú pháp bổ sung.