Meskipun enum
_ adalah kata yang dicadangkan dalam JavaScript, JavaScript tidak mendukung enum tradisional. Namun, cukup mudah untuk mendefinisikan enum menggunakan objek dalam JavaScript. Misalnya, TypeScript memiliki dukungan untuk enum
enum Direction {
Up,
Down,
Left,
Right
}
Saat runtime, TypeScript mengkompilasi kode di atas ke dalam objek seperti enum di bawah
const Direction = {
Up: 'Up',
Down: 'Down',
Left: 'Left',
Right: 'Right'
};
_Objek ini memiliki sebagian besar fitur yang Anda harapkan dari sebuah enum
- Dapatkan semua nilai enum yang diizinkan.
Object.keys[Direction]
mengembalikan array['Up', 'Down', 'Left', 'Right']
- Periksa apakah suatu nilai sama dengan nilai enum.
val === Direction.Up
- Periksa apakah ada nilai dalam enum.
Direction.hasOwnProperty['Up']
Namun, ada beberapa keterbatasan
- Anda dapat memodifikasi enum setelah pembuatan instance. Misalnya, ________72______
- Jika
val === undefined
, maka
0 danconst Direction = { Up: 'Up', Down: 'Down', Left: 'Left', Right: 'Right' };
1. Jadi kesalahan ketik pada properti enum dapat menyebabkan masalahconst Direction = { Up: 'Up', Down: 'Down', Left: 'Left', Right: 'Right' };
- Tidak ada jaminan bahwa nilai properti tidak bertentangan.
_2 validconst Direction = { Up: 'Up', Down: 'Down', Left: 'Left', Right: 'Right' };
Anda dapat membuat objek JavaScript tidak dapat diubah menggunakan
const Direction = {
Up: 'Up',
Down: 'Down',
Left: 'Left',
Right: 'Right'
};
3. Menggunakan const Direction = {
Up: 'Up',
Down: 'Down',
Left: 'Left',
Right: 'Right'
};
_3 dan sebuah fungsi, Anda dapat mengatasi batasan [1] dan [3]Pendekatan Berbasis Kelas
dr. Axel Rauschmayer menyajikan pendekatan yang jauh lebih canggih dalam postingan blog ini menggunakan kelas JavaScript. Pendekatannya akan terlihat lebih seperti ini
class Direction {
static Up = new Direction['Up'];
static Down = new Direction['Down'];
static Left = new Direction['Left'];
static Right = new Direction['Right'];
constructor[name] {
this.name = name;
}
toString[] {
return `Color.${this.name}`;
}
}
Inilah cara Anda dapat bekerja dengan kelas
const Direction = {
Up: 'Up',
Down: 'Down',
Left: 'Left',
Right: 'Right'
};
5- Dapatkan semua nilai enum yang diizinkan.
Object.keys[Direction]
mengembalikan array['Up', 'Down', 'Left', 'Right']
- Periksa apakah suatu nilai sama dengan nilai enum.
_8const Direction = { Up: 'Up', Down: 'Down', Left: 'Left', Right: 'Right' };
- Periksa apakah ada nilai dalam enum.
_9const Direction = { Up: 'Up', Down: 'Down', Left: 'Left', Right: 'Right' };
Pendekatan ini menarik, dan bahkan ada paket enumify npm yang mengimplementasikan pendekatan dasar ini bersama dengan gula sintaksis tambahan. Pendekatan ini juga memiliki manfaat rapi yang
class Direction {
static Up = new Direction['Up'];
static Down = new Direction['Down'];
static Left = new Direction['Left'];
static Right = new Direction['Right'];
constructor[name] {
this.name = name;
}
toString[] {
return `Color.${this.name}`;
}
}
0 melempar kesalahan, yang berarti Anda tidak sengaja memeriksa class Direction {
static Up = new Direction['Up'];
static Down = new Direction['Down'];
static Left = new Direction['Left'];
static Right = new Direction['Right'];
constructor[name] {
this.name = name;
}
toString[] {
return `Color.${this.name}`;
}
}
1 jika Anda salah ketik properti enumNamun, kami umumnya menyarankan penggunaan
const Direction = {
Up: 'Up',
Down: 'Down',
Left: 'Left',
Right: 'Right'
};
_3 pada POJO untuk mewakili enum. Enumify memang menawarkan keuntungan dan beberapa gula sintaksis yang rapi, tetapi menurut kami POJO memberi Anda sebagian besar keuntungan dengan biaya tambahan yang jauh lebih sedikit Diberikan enum yang ada
_4, ketika Anda ingin mengganti nilai yang ada1declare const brand: unique symbol;
2
3type Brand = K & { readonly [brand]: T };
4
5type USD = Brand;
6type EUR = Brand;
7
8let euroAccount = 0 as EUR;
9let dollarAccount = 50 as USD;
10
11// Error: Type '"USD"' is not assignable to type '"EUR"'.
12euroAccount = dollarAccount;
5 dengan e. g.1declare const brand: unique symbol;
2
3type Brand = K & { readonly [brand]: T };
4
5type USD = Brand;
6type EUR = Brand;
7
8let euroAccount = 0 as EUR;
9let dollarAccount = 50 as USD;
10
11// Error: Type '"USD"' is not assignable to type '"EUR"'.
12euroAccount = dollarAccount;
_6, Anda mengubah nilai enum dan selesai1declare const brand: unique symbol;
2
3type Brand = K & { readonly [brand]: T };
4
5type USD = Brand;
6type EUR = Brand;
7
8let euroAccount = 0 as EUR;
9let dollarAccount = 50 as USD;
10
11// Error: Type '"USD"' is not assignable to type '"EUR"'.
12euroAccount = dollarAccount;
Saat Anda menggunakan referensi dalam basis kode Anda,
7 tetap ada tetapi hanya nilai yang diperbarui1declare const brand: unique symbol;
2
3type Brand = K & { readonly [brand]: T };
4
5type USD = Brand;
6type EUR = Brand;
7
8let euroAccount = 0 as EUR;
9let dollarAccount = 50 as USD;
10
11// Error: Type '"USD"' is not assignable to type '"EUR"'.
12euroAccount = dollarAccount;
Penggunaan enum saat kita perlu mengubah nilai 'POST'
1enum HttpMethod {
2 Get = "GET",
3 Post = "POST",
4}
5
6const method: HttpMethod = HttpMethod.Post;
7// ^? 'POST'
Argumen ini tidak terlalu kuat, karena
- Nilai jarang berubah
- Ini bukan hanya solusi yang mungkin [tipe gabungan, objek +
8]1declare const brand: unique symbol;
2
3type Brand = K & { readonly [brand]: T };
4
5type USD = Brand;
6type EUR = Brand;
7
8let euroAccount = 0 as EUR;
9let dollarAccount = 50 as USD;
10
11// Error: Type '"USD"' is not assignable to type '"EUR"'.
12euroAccount = dollarAccount;
Jenis seperti buram
Jika Anda tidak terbiasa dengan tipe Opaque, ini adalah cara untuk mendeklarasikan tipe dari struktur yang sama, yang tidak dapat ditetapkan satu sama lain
Contoh sempurna dapat berupa 2 mata uang [mis. g. USD dan EUR]. Anda tidak bisa begitu saja memasukkan dolar ke akun euro tanpa memperhitungkan nilai tukar mata uang
Contoh tipe buram
1declare const brand: unique symbol;
2
3type Brand = K & { readonly [brand]: T };
4
5type USD = Brand;
6type EUR = Brand;
7
8let euroAccount = 0 as EUR;
9let dollarAccount = 50 as USD;
10
11// Error: Type '"USD"' is not assignable to type '"EUR"'.
12euroAccount = dollarAccount;
Enum string bertindak seperti tipe buram. Ini berarti bahwa kita hanya dapat menetapkan nilai dari enum ini, tetapi bukan literal string
Anda tidak dapat menggunakan string literal sebagai nilai string enum
1const enum VolumeStatus {
2 AUDIBLE = "AUDIBLE",
3 MUTED = "MUTED",
4 FORCE_MUTED = "FORCE_MUTED",
5}
6
7class Volume {
8 public status: VolumeStatus = VolumeStatus.AUDIBLE;
9}
10
11const volume = new Volume[];
12volume.status = VolumeStatus.AUDIBLE;
13
14// Error: Type '"AUDIBLE"' is not assignable to type 'VolumeStatus'.
15volume.status = "AUDIBLE";
🏝 Taman bermain – https. // tsplay. dev/W4xY4W
Mengapa tidak menggunakan enum
Enum numerik BUKAN tipe-aman
Mengingat enum numerik dan variabel apa pun dari jenisnya, TypeScript memungkinkan Anda untuk menetapkan nomor apa pun padanya
TypeScript memungkinkan untuk menetapkan nomor apa pun ke variabel tipe enum numerik
1enum Output {
2 Error = 1,
3 Warning = 2,
4 Log = 3,
5}
6
7interface Options {
8 output?: Output;
9}
10
11const options: Options = {};
12options.output = Output.Error;
13options.output = Output.Warning;
14options.output = Output.Log;
15
16// oops, but still safe
17options.output = 3;
18
19// !!! OOPS !!! unsafe 😅
20options.output = 4;
21options.output = 5;
🏝 Taman bermain – https. // tsplay. dev/mx3rBN
Enum BUKAN hanya fitur tipe yang ditambahkan
TypeScript seharusnya JavaScript, tetapi dengan fitur tipe statis ditambahkan
Jika kita menghapus semua tipe dari kode TypeScript, yang tersisa adalah kode JavaScript yang valid
Kata formal yang digunakan dalam dokumentasi TypeScript adalah "type-level extension"
Sebagian besar fitur TypeScript adalah ekstensi tingkat tipe ke JavaScript, dan tidak memengaruhi perilaku runtime kode
Diberikan fungsi
_9 di TypeScript1declare const brand: unique symbol;
2
3type Brand = K & { readonly [brand]: T };
4
5type USD = Brand;
6type EUR = Brand;
7
8let euroAccount = 0 as EUR;
9let dollarAccount = 50 as USD;
10
11// Error: Type '"USD"' is not assignable to type '"EUR"'.
12euroAccount = dollarAccount;
Contoh TypeScript
1function add[x: number, y: number]: number {
2 return x + y;
3}
4
5add[1, 2]; // Evaluates to 3
Dengan menghapus tipe, itu menjadi kode JS yang valid
Contoh yang sama tetapi dalam JavaScript
1function add[x, y] {
2 return x + y;
3}
4
5add[1, 2]; // Evaluates to 3
Sayangnya, enum melanggar aturan ini [dibandingkan dengan kelas yang hanya menambahkan informasi jenis di atas kode JS yang ada] untuk saat ini
Anda cukup mencoba mengeksekusi kode ini di browser dan Anda akan mendapatkan kesalahan sintaksis
Enum adalah kata kunci yang dicadangkan tetapi tidak dapat digunakan sekarang
1// Uncaught SyntaxError: Unexpected reserved word
2enum Answer { No = 0, Yes = 1 }
Saat posting blog ini ditulis, proposal untuk enum ECMAScript berada di tahap 0
Opsi const enum + pertahankanConstEnums === enum + potensi jebakan
Saat Anda menggunakan const enum, nilainya disisipkan dan tidak ada objek pencarian yang dipancarkan ke JavaScript
Namun, saat Anda mengaktifkan opsi di
0, objek pencarian akan ditampilkan1const enum VolumeStatus {
2 AUDIBLE = "AUDIBLE",
3 MUTED = "MUTED",
4 FORCE_MUTED = "FORCE_MUTED",
5}
6
7class Volume {
8 public status: VolumeStatus = VolumeStatus.AUDIBLE;
9}
10
11const volume = new Volume[];
12volume.status = VolumeStatus.AUDIBLE;
13
14// Error: Type '"AUDIBLE"' is not assignable to type 'VolumeStatus'.
15volume.status = "AUDIBLE";
Const enum dengan preservConstEnum yang diaktifkan
1// typescript
2const enum Answer {
3 No = 0,
4 Yes = "Yes",
5}
6
7const yes = Answer.Yes;
8const no = Answer.No;
9
10// javascript
11var Answer;
12[function [Answer] {
13 Answer[[Answer["No"] = 0]] = "No";
14 Answer["Yes"] = "Yes";
15}][Answer || [Answer = {}]];
16
17const yes = "Yes"; /* Answer.Yes */
18const no = 0; /* Answer.No */
Selain itu, saat Anda menerbitkan const enum atau mengkonsumsinya dari file deklarasi, Anda mungkin menghadapinya
Pilih solusi Anda
Mari kita simpulkan apa yang baru saja kita diskusikan dalam sebuah tabel
Pendekatan Deklarasi Tidak Pencarian Objects1Type-Safe2refactoring3Optimal4Type-only5OPaque-like6Numerik enum ________ 21 _______ 1 ____ol ________ ____ ______ ____ ______ ____ ______ ____ ________ ________ ________ ________.Jenis gabungan adalah fitur khusus jenis sehingga tidak ada kode JS yang dipancarkan. Const enum sebariskan nilainya dan tidak memancarkan objek pencarian. Solusi lain, i. e. objek + sebagai const dan enum normal, keluarkan objek pencarian
Semua enum numerik [baik normal, heterogen, atau const] bukan tipe-aman karena Anda dapat menetapkan nomor apa pun ke variabel tipenya
Hanya tipe gabungan yang tidak memiliki pemfaktoran ulang. Ini berarti bahwa jika Anda perlu memperbarui nilai dalam basis kode, Anda harus menjalankan pemeriksaan tipe atas basis kode Anda dan memperbaiki semua kesalahan tipe. Enum dan objek merangkumnya dengan menyimpan objek pencarian
Untuk dapat membandingkan pendekatan antara satu sama lain, silakan lihat
Hanya tipe gabungan yang merupakan fitur khusus tipe. Solusi lain memancarkan objek pencarian atau bukan hanya fitur tipe yang ditambahkan
Kami memperlakukan semua enum string sebagai tipe mirip-buram. Ini berarti bahwa hanya nilainya yang dapat diberikan ke variabel tipenya
Bagaimana menyingkirkan enum
Jika Anda memutuskan untuk menghapus enum, berikut adalah saran saya
Enum numerik => objek + sebagai const + Nilai
Kita dapat menggunakan
8 dan mengekspos objek JS dengan cara yang sama seperti yang kita lakukan dengan enum numerik tetapi dengan cara yang aman1declare const brand: unique symbol;
2
3type Brand = K & { readonly [brand]: T };
4
5type USD = Brand;
6type EUR = Brand;
7
8let euroAccount = 0 as EUR;
9let dollarAccount = 50 as USD;
10
11// Error: Type '"USD"' is not assignable to type '"EUR"'.
12euroAccount = dollarAccount;
Itu juga termasuk di
Sebelum
Contoh dengan enum numerik
1enum Output {
2 Error = 1,
3 Warning = 2,
4 Log = 3,
5}
6
7interface Options {
8 output?: Output;
9}
10
11const options: Options = {};
12options.output = Output.Error;
13options.output = Output.Warning;
14options.output = Output.Log;
15
16// oops, but still safe
17options.output = 3;
18
19// !!! OOPS !!! unsafe 😅
20options.output = 4;
21options.output = 5;
Setelah
Contoh yang sama dengan objek, seperti const dan Values
_01enum HttpMethod {
2 Get = "GET",
3 Post = "POST",
4}
5
6const method: HttpMethod = HttpMethod.Post;
7// ^? 'POST'
🏝 Bersama di Taman Bermain – https. // tsplay. dev/Nr4r3W
String const enum => tipe gabungan + literal string sebaris
Nilai dalam string const enums biasanya cukup jelas, jadi kita bisa menggunakan tipe gabungan tanpa kehilangan keterbacaan
Ukuran bundel akan sama dengan literal string yang sama yang digariskan saat Anda menggunakan const enum
Sebelum
Contoh dengan string const enum
_11enum HttpMethod {
2 Get = "GET",
3 Post = "POST",
4}
5
6const method: HttpMethod = HttpMethod.Post;
7// ^? 'POST'
Setelah
Contoh yang sama dengan tipe literal string
_21enum HttpMethod {
2 Get = "GET",
3 Post = "POST",
4}
5
6const method: HttpMethod = HttpMethod.Post;
7// ^? 'POST'
Jika Anda perlu menyimpan nilai [mis. e.
_0] dalam tipe terpisah, seperti1enum Output {
2 Error = 1,
3 Warning = 2,
4 Log = 3,
5}
6
7interface Options {
8 output?: Output;
9}
10
11const options: Options = {};
12options.output = Output.Error;
13options.output = Output.Warning;
14options.output = Output.Log;
15
16// oops, but still safe
17options.output = 3;
18
19// !!! OOPS !!! unsafe 😅
20options.output = 4;
21options.output = 5;
1 sebelumnya di enum, Anda masih bisa melakukannya1enum Output {
2 Error = 1,
3 Warning = 2,
4 Log = 3,
5}
6
7interface Options {
8 output?: Output;
9}
10
11const options: Options = {};
12options.output = Output.Error;
13options.output = Output.Warning;
14options.output = Output.Log;
15
16// oops, but still safe
17options.output = 3;
18
19// !!! OOPS !!! unsafe 😅
20options.output = 4;
21options.output = 5;
Jenis kesimpulan dari OutputEvent2
_31enum HttpMethod {
2 Get = "GET",
3 Post = "POST",
4}
5
6const method: HttpMethod = HttpMethod.Post;
7// ^? 'POST'
🏝 Bersama di Taman Bermain – https. // tsplay. dev/mM1klm
Numeric const enums => tergantung
Nilai dalam angka konstanta biasanya tidak dapat dibaca [mis. g.
2,1enum Output {
2 Error = 1,
3 Warning = 2,
4 Log = 3,
5}
6
7interface Options {
8 output?: Output;
9}
10
11const options: Options = {};
12options.output = Output.Error;
13options.output = Output.Warning;
14options.output = Output.Log;
15
16// oops, but still safe
17options.output = 3;
18
19// !!! OOPS !!! unsafe 😅
20options.output = 4;
21options.output = 5;
3]1enum Output {
2 Error = 1,
3 Warning = 2,
4 Log = 3,
5}
6
7interface Options {
8 output?: Output;
9}
10
11const options: Options = {};
12options.output = Output.Error;
13options.output = Output.Warning;
14options.output = Output.Log;
15
16// oops, but still safe
17options.output = 3;
18
19// !!! OOPS !!! unsafe 😅
20options.output = 4;
21options.output = 5;
Ketika sebuah makna tidak masuk akal, Anda masih bisa menggunakan tipe gabungan
Jenis serikat
_41enum HttpMethod {
2 Get = "GET",
3 Post = "POST",
4}
5
6const method: HttpMethod = HttpMethod.Post;
7// ^? 'POST'
Jika tidak, ikuti pendekatan dengan
Ini pasti akan meningkatkan ukuran bundel Anda. Tapi sekali lagi, itu akan membuat kode Anda tetap aman dengan menghilangkan penetapan nomor apa pun
Untuk membandingkan ukuran bundel, silakan lihat
Bagaimana dengan enum ambien
Selain enum dan const enum, ada enum ambien
Ini adalah cara untuk mendeskripsikan bentuk tipe enum yang ada, mis. g
Deklarasi enum ambien
_51enum HttpMethod {
2 Get = "GET",
3 Post = "POST",
4}
5
6const method: HttpMethod = HttpMethod.Post;
7// ^? 'POST'
Biasanya Anda dapat menemukannya di file deklarasi, mis. g.
@prisma/client/runtime/index. d. ts
_61enum HttpMethod {
2 Get = "GET",
3 Post = "POST",
4}
5
6const method: HttpMethod = HttpMethod.Post;
7// ^? 'POST'
Masih sangat tidak mungkin Anda menggunakan enum ambien secara langsung di basis kode Anda. Saya akan merekomendasikan untuk menghindari menggunakannya
Jebakan const enum ambien
Jika Anda MELAKUKAN menggunakannya, Anda mungkin sudah tahu bahwa nilai enum inlining datang dengan implikasi yang halus, berikut adalah beberapa di antaranya
Mereka tidak kompatibel dengan opsi di
01const enum VolumeStatus {
2 AUDIBLE = "AUDIBLE",
3 MUTED = "MUTED",
4 FORCE_MUTED = "FORCE_MUTED",
5}
6
7class Volume {
8 public status: VolumeStatus = VolumeStatus.AUDIBLE;
9}
10
11const volume = new Volume[];
12volume.status = VolumeStatus.AUDIBLE;
13
14// Error: Type '"AUDIBLE"' is not assignable to type 'VolumeStatus'.
15volume.status = "AUDIBLE";
Jika Anda mengekspor const enum dan menyediakannya sebagai API ke pustaka lain, ini dapat menyebabkan bug yang mengejutkan, mis. g. Const enum di TS Compiler API dapat membuat bergantung pada TypeScript menjadi sulit 🐞
Impor yang tidak dapat diselesaikan untuk const enum yang digunakan sebagai nilai menyebabkan kesalahan saat runtime dengan opsi di
0 disetel ke1const enum VolumeStatus {
2 AUDIBLE = "AUDIBLE",
3 MUTED = "MUTED",
4 FORCE_MUTED = "FORCE_MUTED",
5}
6
7class Volume {
8 public status: VolumeStatus = VolumeStatus.AUDIBLE;
9}
10
11const volume = new Volume[];
12volume.status = VolumeStatus.AUDIBLE;
13
14// Error: Type '"AUDIBLE"' is not assignable to type 'VolumeStatus'.
15volume.status = "AUDIBLE";
61enum Output {
2 Error = 1,
3 Warning = 2,
4 Log = 3,
5}
6
7interface Options {
8 output?: Output;
9}
10
11const options: Options = {};
12options.output = Output.Error;
13options.output = Output.Warning;
14options.output = Output.Log;
15
16// oops, but still safe
17options.output = 3;
18
19// !!! OOPS !!! unsafe 😅
20options.output = 4;
21options.output = 5;
TypeScript menyarankan untuk
A. Jangan gunakan const enum sama sekali. Anda dapat dengan mudah melarang const enum dengan bantuan linter. Jelas ini menghindari masalah apa pun dengan const enum, tetapi mencegah proyek Anda membuat inline enumnya sendiri. Tidak seperti menyejajarkan enum dari proyek lain, menyejajarkan enum proyek sendiri tidak bermasalah dan memiliki implikasi kinerja
B. Jangan publikasikan const enum ambien, dengan mendekonstifikasinya dengan bantuan
7. Ini adalah pendekatan yang diambil secara internal oleh proyek TypeScript itu sendiri.1enum Output {
2 Error = 1,
3 Warning = 2,
4 Log = 3,
5}
6
7interface Options {
8 output?: Output;
9}
10
11const options: Options = {};
12options.output = Output.Error;
13options.output = Output.Warning;
14options.output = Output.Log;
15
16// oops, but still safe
17options.output = 3;
18
19// !!! OOPS !!! unsafe 😅
20options.output = 4;
21options.output = 5;
_7 memancarkan JavaScript yang sama untuk enum const sebagai enum biasa. Anda kemudian dapat menghapus pengubah const dengan aman. d. ts dalam langkah build1enum Output {
2 Error = 1,
3 Warning = 2,
4 Log = 3,
5}
6
7interface Options {
8 output?: Output;
9}
10
11const options: Options = {};
12options.output = Output.Error;
13options.output = Output.Warning;
14options.output = Output.Log;
15
16// oops, but still safe
17options.output = 3;
18
19// !!! OOPS !!! unsafe 😅
20options.output = 4;
21options.output = 5;
Baca lebih lanjut tentang
Dampak ukuran bundel
Pertama-tama mari kita lihat contoh [saya hanya meninggalkan contoh dengan nilai heterogen]
Enum
_71enum HttpMethod {
2 Get = "GET",
3 Post = "POST",
4}
5
6const method: HttpMethod = HttpMethod.Post;
7// ^? 'POST'
Konst enum
_81enum HttpMethod {
2 Get = "GET",
3 Post = "POST",
4}
5
6const method: HttpMethod = HttpMethod.Post;
7// ^? 'POST'
Const enum dengan preservConstEnum yang diaktifkan
1// typescript
2const enum Answer {
3 No = 0,
4 Yes = "Yes",
5}
6
7const yes = Answer.Yes;
8const no = Answer.No;
9
10// javascript
11var Answer;
12[function [Answer] {
13 Answer[[Answer["No"] = 0]] = "No";
14 Answer["Yes"] = "Yes";
15}][Answer || [Answer = {}]];
16
17const yes = "Yes"; /* Answer.Yes */
18const no = 0; /* Answer.No */
Enum ambien
_01declare const brand: unique symbol;
2
3type Brand = K & { readonly [brand]: T };
4
5type USD = Brand;
6type EUR = Brand;
7
8let euroAccount = 0 as EUR;
9let dollarAccount = 50 as USD;
10
11// Error: Type '"USD"' is not assignable to type '"EUR"'.
12euroAccount = dollarAccount;
Enum const sekitar
_11declare const brand: unique symbol;
2
3type Brand = K & { readonly [brand]: T };
4
5type USD = Brand;
6type EUR = Brand;
7
8let euroAccount = 0 as EUR;
9let dollarAccount = 50 as USD;
10
11// Error: Type '"USD"' is not assignable to type '"EUR"'.
12euroAccount = dollarAccount;
Objek + sebagai const
_21declare const brand: unique symbol;
2
3type Brand = K & { readonly [brand]: T };
4
5type USD = Brand;
6type EUR = Brand;
7
8let euroAccount = 0 as EUR;
9let dollarAccount = 50 as USD;
10
11// Error: Type '"USD"' is not assignable to type '"EUR"'.
12euroAccount = dollarAccount;
Jenis serikat
_31declare const brand: unique symbol;
2
3type Brand = K & { readonly [brand]: T };
4
5type USD = Brand;
6type EUR = Brand;
7
8let euroAccount = 0 as EUR;
9let dollarAccount = 50 as USD;
10
11// Error: Type '"USD"' is not assignable to type '"EUR"'.
12euroAccount = dollarAccount;
Diberikan 3 jenis nilai yang berbeda [numerik, string, dan heterogen], mari bandingkan ukuran bundel [dalam byte] dari solusi yang berbeda
ApproachEnumConst enumConst enum +7Objek +1enum Output {
2 Error = 1,
3 Warning = 2,
4 Log = 3,
5}
6
7interface Options {
8 output?: Output;
9}
10
11const options: Options = {};
12options.output = Output.Error;
13options.output = Output.Warning;
14options.output = Output.Log;
15
16// oops, but still safe
17options.output = 3;
18
19// !!! OOPS !!! unsafe 😅
20options.output = 4;
21options.output = 5;
8Union typeNilai numerik126441128044Nilai heterogen124481178348Nilai string1164910883491declare const brand: unique symbol;
2
3type Brand = K & { readonly [brand]: T };
4
5type USD = Brand;
6type EUR = Brand;
7
8let euroAccount = 0 as EUR;
9let dollarAccount = 50 as USD;
10
11// Error: Type '"USD"' is not assignable to type '"EUR"'.
12euroAccount = dollarAccount;
Saat Anda perlu menyimpan objek pencarian [enum, const enum +
7 dan objek +1enum Output {
2 Error = 1,
3 Warning = 2,
4 Log = 3,
5}
6
7interface Options {
8 output?: Output;
9}
10
11const options: Options = {};
12options.output = Output.Error;
13options.output = Output.Warning;
14options.output = Output.Log;
15
16// oops, but still safe
17options.output = 3;
18
19// !!! OOPS !!! unsafe 😅
20options.output = 4;
21options.output = 5;
8], solusi optimal selalu berupa objek +1declare const brand: unique symbol;
2
3type Brand = K & { readonly [brand]: T };
4
5type USD = Brand;
6type EUR = Brand;
7
8let euroAccount = 0 as EUR;
9let dollarAccount = 50 as USD;
10
11// Error: Type '"USD"' is not assignable to type '"EUR"'.
12euroAccount = dollarAccount;
81declare const brand: unique symbol;
2
3type Brand = K & { readonly [brand]: T };
4
5type USD = Brand;
6type EUR = Brand;
7
8let euroAccount = 0 as EUR;
9let dollarAccount = 50 as USD;
10
11// Error: Type '"USD"' is not assignable to type '"EUR"'.
12euroAccount = dollarAccount;
Saat Anda tidak memerlukan objek pencarian [const enum dan tipe union], baik const enum dan tipe union adalah optimal
Jika Anda tertarik dengan perbandingan itu sendiri, silakan buka repo Github dengan-atau-tanpa-enums-bundle-size-impact 🔗
Teriak
Artikel ini tidak bisa sebagus itu tanpa bantuan dari
- AleksandrSI
- Joe Previt
- bautistaaa
- Biswajit Jha
Terima kasih rekan, umpan balik Anda sangat membantu. 👏
Tautan 🔗
Bagaimana cara kerja varian enum yang berbeda di TypeScript?. Tumpukan Luapan
Fitur TS yang harus dihindari. Jalankan Program
Kata kunci yang dicadangkan JavaScript
Proposal untuk enum ECMAScript. GitHub
dengan-atau-tanpa-enums-bundel-ukuran-dampak. GitHub
Ditulis oleh Alexey Berezin yang mencintai London 🏴, pemain ⏯ dan naskah 🦺 Ikuti saya di Twitter