Jika kita familiar dengan Swift kita pasti sudah tahu apa kegunaan dari Enum itu sendiri. Saya pernah menulis tentang Enum di Swift di sini. Di Swift maupun Typescript Enum digunakan untuk mendefiniskan atau menge-set suatu value dengan sifat constant atau istilah yang disebut dengan Initialization (Inisiasi). Perlu diketahui juga bahwa Enum pada Typescript bukan merupakan Type Level Extension. Pada Typescript enum disediakan dalam bentuk numeric dan string atau bahkan keduanya. Untuk mendefiniskan Enum kita menggunakan keyword enum. Sama halnya dengan di Swift. Basic syntax-nya adalah sebagai berikut: Show enum NameOfEnum { Numeric EnumsArtinya adalah kita melakukan inisiasi pada member dengan tipe data Number. enum OperatingSystem { Pada kode di atas kita memberikan inisiasi pada member macOS dengan value 1. Lalu pertanyaanya adalah untuk member yang lain berapa inisiasinya? Jawabanya adalah untuk member windows = 2 dan member linux = 3. Kenapa? Karena Enum pada TypeScript menganut sistem Auto Incerement dari setelah member yand diberi inisiasi. Jadi kalau kita memanggil enum tersebut akan seperti pada kode berikut: OperatingSystem.macOS // 1 Lalu bagaimana dengan kasus berikut. Kita memberikan inisiasi pada member kedua atau ketiga. enum OperatingSystem { Maka yang akan terjadi adalah member macOS = 0, member windows = 1 dan member linux = 2. karena default value untuk member yang pertama adalah 0 dan untuk member berikutnya adalah auto increment dari member sebelumnya. Lalu bagaimana cara menggunakan enum sebagai parameter sebuah function? Mari kita lihat contoh berikut: enum isDualSim { Kalau kita perhatikan bahwa enum juga dapat kita implementasikan sebagai interface pada function seperti yang ada di TypeScript pada umumnya. String EnumsPada dasarnya sama dengan Numeric Enums hanya saja perbedaanya adalah ketika kita assign pada member tipenya adalah String. Dan satu hal lagi tidak ada konsep Auto Increment pada String Enums. enum Direction { Heterogeneous EnumsEnum jenis adalah gabungan dari Numeric Enums dan String Enums. Sebenernya sangat mudah jadi saya langsung kasih contoh saja: enum BooleanLikeHeterogeneousEnum { Computed & Constans MemberPada dasarnya member pada suatu enum adalah constant. Namun demikian, kita dapat menerapkan konsep computed pada member itu sendiri. enum GadgetInventoy { Union EnumsIntinya kita dapat menjadikan member enum sebagai types di dalam interface. enum OsTypes { Kita lihat pada code diatas untuk type di interface kita menggunakan member dari enum. Untuk mengimplementasinya harusnya begini: let laptop: Apple = { Jika kita salah menempatkan property os pada object di atas maka akan terjadi error. Karena tidak sesuai kontrak. Contoh salah sebagai berikut: enum OperatingSystem { 0Error tersebut terjadi karena type property os tidak di dalam kontrak interface Apple. Seharusnya kontrak tersebut ada pada interface Samsung. Dengan pengenalan Kelas-kelas yang ada di TypeScript dan ES6, sekarang ada skenario tertentu yang memerlukan fitur tambahan untuk mendukung anotasi atau modifikasi kelas dan anggota kelas. Decorators menyediakan cara untuk menambahkan anotasi-anotasi dan sebuah sintaks pemrogragaman meta untuk deklarasi kelas dan anggota kelas. Decorators ada pada stage 2 proposal untuk JavaScript dan juga tersedia pada TypeScript sebagai fitur eksperimental.
Untuk mengaktifkan Decorators eksperimental, anda harus menambahkan opsi 4 ke baris perintah atau ke berkas 5. Command Line:
tsconfig.json:
DecoratorDecorator adalah jenis deklarasi khusus yang dapat dilampirkan ke , , , , atau . Decorators menggunakan bentuk 6, dimana 7 harus mengevaluasi fungsi yang akan dipanggil saat proses dengan informasi tentang deklarasi yang didekorasi. Sebagai contoh, ada decorator 8 yang mungkin kita akan menuliskan fungsi 9 sebagai berikut:
Decorator FactoriesJika kita ingin menyesuaikan penerapan decorator pada sebuah deklarasi, kita dapat menuliskan sebuah decorator factory. Decorator Factory adalah sebuah fungsi yang mengembalikan ekspresi yang akan dipanggil oleh decorator ketika proses. Kita dapat menuliskan decorator factory seperti berikut:
Komposisi DecoratorLebih dari satu decorator dapat diterapkan pada sebuah deklarasi, seperti contoh berikut:
Ketika lebih dari satu decorator diterapkan ke sebuah deklarasi, evaluasi yang dilakukan mirip seperti fungsi komposisi pada matematika. Pada model ini, ketika mengkomposisikan fungsi f dan g, maka akan menjadi (f ∘ g)(x) yang sama dengan f(g(x)). Dengan demikian, langkah-langkah berikut dilakukan saat mengevaluasi beberapa decorator pada satu deklarasi di TypeScript:
JIka kita menggunakan , kita dapat mengamati urutan evaluasi ini dengan contoh berikut:
Yang akan mencetak keluaran ini ke console:
Evaluasi DecoratorAda urutan yang jelas tentang bagaimana decorator diterapkan ke berbagai deklarasi yang ada di dalam kelas:
Decorator KelasClass Decorator dideklarasikan tepat sebelum deklarasi kelas. Decorator kelas diterapkan ke konstruktor kelas dan dapat digunakan untuk mengamati, memodifikasi, atau mengganti definisi kelas. Decorator kelas tidak dapat digunakan dalam berkas deklarasi, atau dalam konteks ambien lainnya (seperti pada kelas 0). Ekspresi untuk decorator kelas akan dipanggil sebagai fungsi pada waktu proses, dengan konstruktor kelas yang didekorasi sebagai satu-satunya argumennya. Jika decorator kelas mengembalikan nilai, deklarasi kelas akan diganti dengan fungsi konstruktor yang disediakan.
Berikut ini adalah contoh decorator kelas ( 8) yang diterapkan ke kelas 2:
Kita dapat mendefinisikan decorator 8 menggunakan deklarasi fungsi berikut:
Ketika 8 dijalankan, itu akan menyegel konstruktor dan prototipenya. Selanjutnya kita memiliki contoh bagaimana menimpa konstruktor. 0 Method DecoratorsMethod Decorator dideklarasikan tepat sebelum deklarasi method. Dekorator diterapkan ke Property Descriptor untuk method, yang dapat digunakan untuk mengamati, memodifikasi, atau mengganti definisi method. Method Decorator tidak dapat digunakan dalam berkas deklarasi, saat kelebihan beban, atau dalam konteks ambien lainnya (seperti dalam kelas 5). Ekspresi untuk method decorator akan dipanggil sebagai fungsi pada waktu proses, dengan tiga argumen berikut:
Jika method decorator mengembalikan sebuah nilai, maka akan digunakan sebagai Property Descriptor untuk method.
Berikut adalah contoh penerapan method decorator ( 9) ke method yang ada pada kelas 2: 1 Kita dapat mendefinisikan decorator 9 menggunakan fungsi deklarasi berikut: 2 Decorator 2 disini adalah sebuah . Ketika decorator 2 dipanggil, ia akan merubah 4 properti dari properti descriptor. Decorator AksesorSebuah Accessor Decorator dideklarasikan tepat sebelum sebuah deklarasi aksesor. Decorator aksesor diterapkan ke Property Descriptor untuk aksesor dan dapat digunakan untuk mengamati, memodifikasi, atau mengganti definisi aksesor. Decorator aksesor tidak dapat digunakan dalam deklarasi berkas, atau dalam konteks ambien lainnya (seperti dalam kelas 5).
Ekspresi untuk decorator pengakses akan dipanggil sebagai fungsi pada waktu proses, dengan tiga argumen berikut:
Jika aksesor decorator mengembalikan sebuah nilai, ia akan digunakan sebagai Property Descriptor untuk anggota.
Berikut ada contoh penerapan aksesor decorator ( 3) ke anggota kelas 4: 3 Kita dapat mendefinisikan decorator 3 menggunakan deklarasi fungsi berikut: 4 Property DecoratorsSebuah Property Decorator dideklarasikan tepat sebelum deklarasi properti. Property Decorator tidak dapat digunakan dalam deklarasi berkas, atau dalam konteks ambien lainnya (seperti dalam kelas 5). Ekspresi untuk properti decorator akan dipanggil sebagai fungsi pada waktu proses, dengan dua argumen berikut:
Kita dapat menggunakan informasi tersebut untuk memantau properti metadata, seperti pada contoh berikut: 5 Kemudian, kita dapat mendefinisikan decorator 7 dan fungsi 8 dengan menggunakan deklarasi fungsi berikut: 6 Decorator 9 disini adalah sebuah . Ketika 9 dipanggil, ia akan menambahkan properti metadata menggunakan fungsi 1 dari pustaka 2. Ketika 8 dipanggil, ia akan membaca format dari nilai metadata-nya.
Parameter DecoratorsParameter Decorator dideklarasikan tepat sebelum a parameter dideklarasikan. Parameter decorator diterapkan ke fungsi konstruktor pada kelas atau saat deklarasi method. Parameter decorator tidak dapat digunakan dalam deklarasi berkas, overload, atau dalam konteks ambien lainnya (seperti dalam kelas 5). Ekspresi untuk parameter decorator akan dipanggil sebagai fungsi pada waktu proses, dengan tiga argumen berikut:
Nilai kembalian dari parameter decorator akan dibiarkan. Berikut adalah contoh penggunaan parameter decorator ( 7) pada anggota kelas 2: 7 Kemudian, kita dapat mendefinisikan decorator 7 dan 0 menggunakan deklarasi fungsi berikut: 8 Decorator 7 menambahkan entri metadata yang menandakan bahwa parameter tersebut diperlukan. Decorator 0 kemudian akan memvalidasi semua argumen yang ada, sebelum method-nya dijalankan.
MetadataBeberapa contoh menggunakan pustaka 2 yang menambahkan polyfill untuk API metadata eksperimental. Pustaka ini belum menjadi bagian dari standar ECMAScript (JavaScript). Namun, ketika decorator secara resmi diadopsi sebagai bagian dari standar ECMAScript, ekstensi ini akan diusulkan untuk diadopsi. Anda dapat memasang pustaka ini melalui npm: 9 TypeScript menyertakan dukungan eksperimental untuk menghadirkan jenis metadata tertentu untuk deklarasi yang memiliki decorator. Untuk mengaktifkan dukungan eksperimental ini, Anda harus mengatur opsi kompilator 6 baik pada baris perintah atau di 5 Anda: Command Line: 0 tsconfig.json: 1 Ketika diaktifkan, selama pustaka 2 di-import, informasi jenis design-time tambahan akan diekspos saat runtime. Kita dapat melihat action pada contoh berikut: 2 Kompilator TypeScript akan memasukkan informasi jenis design-time menggunakan decorator 9. Anda dapat menganggapnya setara dengan TypeScript berikut: 3
|