0Pricing
Frontend Academy · Pelajaran

Dekorator dan Metadata

Aktifkan dekorator eksperimental, tulis dekorator untuk class, method, dan properti, lalu gunakan reflect-metadata untuk pola injeksi dependensi.

Dekorator dan Metadata adalah pelajaran Frontend Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Frontend Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Frontend Academy mencakup 4 pelajaran total.

Apa Itu Dekorator?

Dekorator adalah fungsi yang memodifikasi kelas, metode, properti, atau parameter pada saat definisi. Dekorator banyak digunakan dalam Angular, NestJS, TypeORM, dan MobX berbasis kelas.

Sintaks Dekorator

Awali kelas, metode, properti, atau parameter dengan @DecoratorName. Fungsi dekorator dijalankan saat kelas didefinisikan.

@Component({ selector: 'app-root' })
export class AppComponent {
  @Input() title: string;

  @HostListener('click')
  onClick() {
    console.log('clicked');
  }
}

Mengaktifkan Dekorator

Aktifkan opsi eksperimental di tsconfig.json. Dekorator ECMAScript Tahap 3 yang baru (TypeScript 5.0+) tidak memerlukan opsi ini, tetapi memiliki semantik yang berbeda.

{
  "compilerOptions": {
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true
  }
}

Dekorator Kelas

Menerima konstruktor sebagai argumennya. Dekorator ini dapat mengganti, membungkus, atau memperluas kelas.

function Singleton<T extends { new (...a: any[]): {} }>(target: T) {
  let instance: T;
  return class extends target {
    constructor(...args: any[]) {
      if (!instance) instance = new target(...args) as T;
      return instance;
    }
  };
}

@Singleton
class Logger { /* ... */ }

Dekorator Metode

Menerima (sasaran, kunci, deskriptor). Dekorator ini dapat membungkus metode—misalnya untuk mencatat pemanggilan.

function Log(target: any, key: string, descriptor: PropertyDescriptor) {
  const original = descriptor.value;
  descriptor.value = function (...args: any[]) {
    console.log(`[${key}]`, args);
    return original.apply(this, args);
  };
}

class Service {
  @Log
  greet(name: string) { return `Hello ${name}`; }
}

Dekorator Properti

Menerima (sasaran, kunci). Sering digunakan bersama reflect-metadata untuk mendaftarkan informasi tentang properti.

function Required(target: any, key: string) {
  const existing = Reflect.getMetadata('required', target) || [];
  Reflect.defineMetadata('required', [...existing, key], target);
}

class User {
  @Required name: string;
  @Required email: string;
}

Dekorator Parameter

Menerima (sasaran, kunci, parameterIndex). Digunakan untuk injeksi dependensi—mencatat parameter mana yang memerlukan layanan tertentu.

function Inject(token: string) {
  return function (target: any, key: string, index: number) {
    const existing = Reflect.getMetadata('inject', target, key) || {};
    existing[index] = token;
    Reflect.defineMetadata('inject', existing, target, key);
  };
}

class UserService {
  constructor(@Inject('Database') db: Database) {}
}

reflect-metadata

reflect-metadata adalah polyfill yang memungkinkan dekorator membaca dan menulis metadata pada kelas. Ini diperlukan untuk DI Angular dan banyak ORM.

npm install reflect-metadata

// main.ts (entry point):
import 'reflect-metadata';

import { Reflect } from 'reflect-metadata';
Reflect.defineMetadata('key', 'value', target);
Reflect.getMetadata('key', target); // 'value'

Pabrik Dekorator

Sebuah pabrik mengembalikan dekorator—digunakan untuk meneruskan argumen.

function Component(config: { selector: string }) {
  return function (target: any) {
    target.selector = config.selector;
  };
}

@Component({ selector: 'app-root' })
class AppComponent {}

Kasus Penggunaan Validasi

Gabungkan dekorator properti dengan fungsi validasi untuk membangun pustaka validasi kecil.

// Decorator records that a field is required:
function Required(target: any, key: string) {
  const fields = Reflect.getMetadata('required', target) || [];
  Reflect.defineMetadata('required', [...fields, key], target);
}

class User {
  @Required name!: string;
  @Required email!: string;
}

function validate(obj: any): string[] {
  const required: string[] = Reflect.getMetadata('required', obj) || [];
  return required.filter(k => obj[k] == null);
}

Dekorator Tahap 3 (TC39)

Dekorator terstandar (TS 5.0+, didukung di Node 22+ di balik sebuah opsi) memiliki tanda tangan yang berbeda. Dekorator ini tidak memerlukan opsi eksperimental maupun reflect-metadata.

Kapan Menggunakan Dekorator

Gunakan dekorator saat framework menyediakannya (Angular, NestJS, TypeORM). Jangan membuatnya sendiri dalam kode frontend biasa—dekorator menambah kompleksitas dan mengikat Anda pada perilaku runtime tertentu.

Pemeriksaan Singkat

Opsi tsconfig apa yang harus diaktifkan untuk menggunakan dekorator lama (eksperimental) dengan refleksi metadata?

Rangkuman: Dekorator

Dekorator memodifikasi kelas, metode, properti, atau parameter pada saat definisi. Aktifkan experimentalDecorators + emitDecoratorMetadata. Tanda tangan dekorator kelas, metode, properti, dan parameter berbeda-beda. reflect-metadata menyimpan metadata; pabrik meneruskan argumen. Dekorator banyak digunakan oleh Angular, NestJS, dan TypeORM. Dekorator Tahap 3 (TS 5+) adalah masa depan dan tidak memerlukan opsi.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Dekorator dan Metadata” gratis?

Ya — teks lengkap “Dekorator dan Metadata” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Frontend Academy, upgrade ke CoddyKit PRO. Kursus Frontend Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Dekorator dan Metadata”?

Aktifkan dekorator eksperimental, tulis dekorator untuk class, method, dan properti, lalu gunakan reflect-metadata untuk pola injeksi dependensi. Kamu berlatih Frontend Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Frontend Academy?

Tidak diperlukan pengalaman sebelumnya. Frontend Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Dekorator dan Metadata” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Frontend Academy ini?

Ya. Setiap pelajaran Frontend Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Tipe Literal Templat
  2. Dekorator dan Metadata
  3. TypeScript dengan React: Generik FC dan Hook
  4. Mode Ketat dan Menghapus any
← Kembali ke Frontend Academy