Hướng dẫn enums in nodejs - enums trong nodejs

Chúng ta sẽ trả lời 2 câu hỏi sau: enum của TypeScript làm việc như thế nào? Nó được sử dụng để làm gì. Vỡ lòng cho người mới viết TypeScript

Các khái niệm căn bản của enum

Javascript chỉ có đúng một kiểu mà giá trị bị ràng buộc rất cụ thể: 

function toGerman[value: NoYes] {
  switch [value] {
    case NoYes.No:
      return 'Nein';
    case NoYes.Yes:
      return 'Ja';
  }
}
8, giá trị chỉ được phép là 
function toGerman[value: NoYes] {
  switch [value] {
    case NoYes.No:
      return 'Nein';
    case NoYes.Yes:
      return 'Ja';
  }
}
9 hoặc 
enum NoYes {
  No,
  Yes,
}
// nếu khai báo một cách tường minh hơn
enum NoYes {
  No = 0,
  Yes = 1,
}

assert.equal[NoYes.No, 0];
assert.equal[NoYes.Yes, 1];
0, không chấp nhận một giá trị nào khác. 
enum NoYes {
  No,
  Yes,
}
// nếu khai báo một cách tường minh hơn
enum NoYes {
  No = 0,
  Yes = 1,
}

assert.equal[NoYes.No, 0];
assert.equal[NoYes.Yes, 1];
1 là phiên bản mở rộng với công dụng tương tự như 
function toGerman[value: NoYes] {
  switch [value] {
    case NoYes.No:
      return 'Nein';
    case NoYes.Yes:
      return 'Ja';
  }
}
8

enum NoYes {
    No,
    Yes
}

2 giá trị

enum NoYes {
  No,
  Yes,
}
// nếu khai báo một cách tường minh hơn
enum NoYes {
  No = 0,
  Yes = 1,
}

assert.equal[NoYes.No, 0];
assert.equal[NoYes.Yes, 1];
enum NoYes {
  No,
  Yes,
}
// nếu khai báo một cách tường minh hơn
enum NoYes {
  No = 0,
  Yes = 1,
}

assert.equal[NoYes.No, 0];
assert.equal[NoYes.Yes, 1];
4 được gọi là thành viên của hội 
enum NoYes {
  No,
  Yes,
}
// nếu khai báo một cách tường minh hơn
enum NoYes {
  No = 0,
  Yes = 1,
}

assert.equal[NoYes.No, 0];
assert.equal[NoYes.Yes, 1];
enum NoYes {
  No,
  Yes,
}
// nếu khai báo một cách tường minh hơn
enum NoYes {
  No = 0,
  Yes = 1,
}

assert.equal[NoYes.No, 0];
assert.equal[NoYes.Yes, 1];
6. Dùng nó như một 
enum NoYes {
  No,
  Yes,
}
// nếu khai báo một cách tường minh hơn
enum NoYes {
  No = 0,
  Yes = 1,
}

assert.equal[NoYes.No, 0];
assert.equal[NoYes.Yes, 1];
7, chúng ta có thể chấm đến giá trị đó

function toGerman[value: NoYes] {
  switch [value] {
    case NoYes.No:
      return 'Nein';
    case NoYes.Yes:
      return 'Ja';
  }
}

Tất cả thành viên của hội

enum NoYes {
  No,
  Yes,
}
// nếu khai báo một cách tường minh hơn
enum NoYes {
  No = 0,
  Yes = 1,
}

assert.equal[NoYes.No, 0];
assert.equal[NoYes.Yes, 1];
5 đều được cấp một thẻ thành viên gồm 
enum NoYes {
  No,
  Yes,
}
// nếu khai báo một cách tường minh hơn
enum NoYes {
  No = 0,
  Yes = 1,
}

assert.equal[NoYes.No, 0];
assert.equal[NoYes.Yes, 1];
9 và 
enum Enum {
  A,
  B,
  C = 4,
  D,
  E = 8,
  F,
}
0. Ở trên chúng ta chỉ đang khai báo phần 
enum NoYes {
  No,
  Yes,
}
// nếu khai báo một cách tường minh hơn
enum NoYes {
  No = 0,
  Yes = 1,
}

assert.equal[NoYes.No, 0];
assert.equal[NoYes.Yes, 1];
9 cho enum, 
enum Enum {
  A,
  B,
  C = 4,
  D,
  E = 8,
  F,
}
0 lúc đó sẽ lấy mặc định là số từ 0 đi lên

enum NoYes {
  No,
  Yes,
}
// nếu khai báo một cách tường minh hơn
enum NoYes {
  No = 0,
  Yes = 1,
}

assert.equal[NoYes.No, 0];
assert.equal[NoYes.Yes, 1];

Nếu cà khịa, khai báo như thế này

enum Enum {
  A,
  B,
  C = 4,
  D,
  E = 8,
  F,
}

Đồng nghĩa là các giá trị kế tiếp sẽ tự động tăng lên một, so với giá trị khai báo trước đó

assert.deepEqual[
  [Enum.A, Enum.B, Enum.C, Enum.D, Enum.E, Enum.F],
  [0, 1, 4, 5, 8, 9]
];

Về cách đặt tên [

enum NoYes {
  No,
  Yes,
}
// nếu khai báo một cách tường minh hơn
enum NoYes {
  No = 0,
  Yes = 1,
}

assert.equal[NoYes.No, 0];
assert.equal[NoYes.Yes, 1];
9] trong 
enum NoYes {
  No,
  Yes,
}
// nếu khai báo một cách tường minh hơn
enum NoYes {
  No = 0,
  Yes = 1,
}

assert.equal[NoYes.No, 0];
assert.equal[NoYes.Yes, 1];
5, cũng có vài ba lựa chọn

  • Đặt theo kiểu JavaScript, viết hoa hết, 
    enum Enum {
      A,
      B,
      C = 4,
      D,
      E = 8,
      F,
    }
    5
  • Đặt theo kiểu symbol, con lạc đà, chữ đầu viết thường, 
    enum Enum {
      A,
      B,
      C = 4,
      D,
      E = 8,
      F,
    }
    6
  • Kiểu TypeScript, con lạc đà, chữ đầu viết hoa, 
    enum Enum {
      A,
      B,
      C = 4,
      D,
      E = 8,
      F,
    }
    7

Tương tự như object, chúng ta có thể truy xuất đến một thành viên của hội bằng cách viết sau

enum HttpRequestField {
  'Accept',
  'Accept-Charset',
  'Accept-Datetime',
  'Accept-Encoding',
  'Accept-Language',
}
assert.equal[HttpRequestField['Accept-Charset'], 1];

Giá trị

enum Enum {
  A,
  B,
  C = 4,
  D,
  E = 8,
  F,
}
0 của enum, không bắt buộc là một number, có thể là một 
enum Enum {
  A,
  B,
  C = 4,
  D,
  E = 8,
  F,
}
9

enum NoYes {
  No = 'No',
  Yes = 'Yes',
}
assert.equal[NoYes.No, 'No'];
assert.equal[NoYes.Yes, 'Yes'];

Còn một cách khai báo, ít được sử dụng, là kiểu xăng pha nhớt, các giá trị trong enum có thể là số cũng có thể là chữ

enum Enum {
  A,
  B,
  C = 'C',
  D = 'D',
  E = 8,
  F,
}
assert.deepEqual[
  [Enum.A, Enum.B, Enum.C, Enum.D, Enum.E, Enum.F],
  [0, 1, 'C', 'D', 8, 9]
];

Theo như kinh nghiệm từ các bật tiền bối, sử dụng enum thì nên dùng kiểu giá trị

enum Enum {
  A,
  B,
  C = 4,
  D,
  E = 8,
  F,
}
9

enum NoYes { No = 'NO', Yes = 'YES' }

Nếu có log ra chúng ta cũng biết được giá trị chính xác là gì, đỡ hack não ngồi đếm số thứ tự

console.log[NoYes.No];
console.log[NoYes.Yes];

Thêm nữa, ràng buộc được luôn kiểu giá trị

function toGerman[value: NoYes] {
  switch [value] {
    case NoYes.No:
      return 'Nein';
    case NoYes.Yes:
      return 'Ja';
  }
}
0

Trường hợp sử dụng enum

hằng số nhiều giá trị

Nếu chúng ta có một mớ các hằng số, có quan hệ họ hàng gần với nhau

function toGerman[value: NoYes] {
  switch [value] {
    case NoYes.No:
      return 'Nein';
    case NoYes.Yes:
      return 'Ja';
  }
}
1

Có thể dùng enum

function toGerman[value: NoYes] {
  switch [value] {
    case NoYes.No:
      return 'Nein';
    case NoYes.Yes:
      return 'Ja';
  }
}
2

Lợi ích mang lại: nhóm lại với nhau một cục, TypeScript dễ đàng kiểm tra giúp chúng ta

Tường minh hơn boolean

Chúng ta hay dùng boolean để làm cờ bật tắt hoặc đảo ngược giá trị

function toGerman[value: NoYes] {
  switch [value] {
    case NoYes.No:
      return 'Nein';
    case NoYes.Yes:
      return 'Ja';
  }
}
3

Nếu dùng enum, nó sẽ rõ nghĩa hơn, nhiều lựa chọn hơn

function toGerman[value: NoYes] {
  switch [value] {
    case NoYes.No:
      return 'Nein';
    case NoYes.Yes:
      return 'Ja';
  }
}
4

String là một hằng số đúng nghĩa, an toàn hơn vì không thể thay đổi được giá trị

Ví dụ hàm bên dưới dùng 

assert.deepEqual[
  [Enum.A, Enum.B, Enum.C, Enum.D, Enum.E, Enum.F],
  [0, 1, 4, 5, 8, 9]
];
1

function toGerman[value: NoYes] {
  switch [value] {
    case NoYes.No:
      return 'Nein';
    case NoYes.Yes:
      return 'Ja';
  }
}
5

dùng enum tiện hơn

function toGerman[value: NoYes] {
  switch [value] {
    case NoYes.No:
      return 'Nein';
    case NoYes.Yes:
      return 'Ja';
  }
}
6

Enum lúc chạy thì sẽ trở thành gì?

Sau khi TypeScript đã compile, enum sẽ được được chuyển thành javascript object

function toGerman[value: NoYes] {
  switch [value] {
    case NoYes.No:
      return 'Nein';
    case NoYes.Yes:
      return 'Ja';
  }
}
7

THam khảo các vị trí tuyển lập trình Typescript cho bạn.

TopDev via Vuilaptrinh

Bài Viết Liên Quan

Chủ Đề