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:
- seperangkat nilai yang sudah dikenal dan tertutup (yang tidak akan memungkinkan salah ketik nanti), masing-masing memiliki...
- sekumpulan tipe menyerupai literal masing-masing untuk setiap anggota, semuanya disediakan...
- 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);
}
