apa pentingnya enum dalam typescript


apa kegunaan enum dalam typescript. Jika tujuannya hanya untuk membuat kode lebih mudah dibaca, apakah kita tidak bisa hanya menggunakan konstanta untuk tujuan yang sama

enum Color {
Red = 1, Green = 2, Blue = 4
};


let obj1: Color = Color.Red;
obj1 = 100; // does not show any error in IDE while enum should accept some specific values

Jika tidak ada keuntungan dari pengecekan tipe, bukankah itu bisa saja ditulis sebagai.

const BasicColor = {
    Red: 1,
    Green: 2,
    Blue: 4
};

let obj2 = BasicColor.Red;

Jawaban #1

Pertama, dalam hal berikut:

const BasicColor = {
    Red: 1,
    Green: 2,
    Blue: 4
};

Merah, Hijau, dan Biru masih dapat diubah (sedangkan mereka tidak dapat diubah dalam sebuah enum).

Enum juga menyediakan beberapa hal:

  1. seperangkat nilai yang sudah dikenal dan tertutup (yang tidak akan memungkinkan salah ketik nanti), masing-masing memiliki...
  2. sekumpulan tipe menyerupai literal masing-masing untuk setiap anggota, semuanya disediakan...
  3. oleh satu tipe bernama yang mencakup semua nilai

Untuk mendapatkan itu dengan sesuatu seperti namespace, misalnya, Anda harus melakukan sesuatu seperti

export namespace Color
    export const Red = 1
    export type Red = typeof Red;

    export const Green = 2;
    export type Green = 2;

    export const Blue = 3;
    export type Blue = typeof Blue;
}
export type Color = Color.Red | Color.Blue | Color.Green

Yang juga Anda catat adalah beberapa perilaku warisan yang kurang menguntungkan di mana TypeScript memperbolehkan penugasan dari nilai numerik apa pun ke enum numerik.

Tetapi jika Anda menggunakan enum string, Anda tidak akan mendapatkan perilaku itu. Ada juga hal-hal lain seperti pemeriksaan kelengkapan yang dapat Anda aktifkan dengan enum gabungan:

enum E {
  Hello = "hello",
  Beautiful = "beautiful",
  World = "world"
}

// if a type has not been exhaustively tested,
// TypeScript will issue an error when passing
// that value into this function
function assertNever(x: never) {
  throw new Error("Unexpected value " + x);
}

declare var x: E;
switch (x) {
  case E.Hello:
  case E.Beautiful:
  case E.World:
    // do stuff...
    break;
  default: assertNever(x);
}

Artikel terkait