0Pricing
TypeScript Academy · Pelajaran

Kelas Pemancar Peristiwa Generik

Bangun pemancar peristiwa bertipe yang dapat digunakan kembali dari awal.

Kelas Pemancar Peristiwa Generik adalah pelajaran TypeScript Academy gratis di CoddyKit. Ini adalah pelajaran 3 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 TypeScript Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus TypeScript Academy mencakup 4 pelajaran total.

Tujuan: Kelas TypedEmitter

Kita akan membuat kelas TypedEmitter<E> yang dapat digunakan kembali dan bersifat generik berdasarkan pemetaan peristiwa E, dengan metode on, off, dan emit yang sepenuhnya bertipe.

interface Events { login: { userId: string }; logout: void }
// class TypedEmitter<Events> will manage handlers safely.
console.log("building a typed emitter");

Alias Tipe Penangan

Definisikan tipe penangan yang diparameterkan berdasarkan nama peristiwa agar setiap pendengar menerima muatan yang tepat.

type Handler<E, K extends keyof E> = (payload: E[K]) => void;
// E[K] is the payload type for event K in map E.
console.log("handler typed by E[K]");

Pemetaan listeners

Simpan penangan dengan kunci nama peristiwa. Tipe terpetakan memberikan setiap kunci sebuah larik penangan bertipe tepat.

class TypedEmitter<E> {
  private listeners: { [K in keyof E]?: Array<(p: E[K]) => void> } = {};
}
console.log("listeners map ready");

Menerapkan Pendaftaran

Metode on menambahkan penangan ke larik untuk peristiwanya, serta membuat larik tersebut saat pertama kali digunakan.

class TypedEmitter<E> {
  private listeners: { [K in keyof E]?: Array<(p: E[K]) => void> } = {};
  on<K extends keyof E>(event: K, handler: (p: E[K]) => void): void {
    (this.listeners[event] ||= []).push(handler);
  }
}
console.log("on implemented");

Menerapkan emit

Metode emit mencari penangan untuk peristiwa tersebut dan memanggil masing-masing dengan muatan bertipe.

class TypedEmitter<E> {
  private listeners: { [K in keyof E]?: Array<(p: E[K]) => void> } = {};
  on<K extends keyof E>(e: K, h: (p: E[K]) => void) { (this.listeners[e] ||= []).push(h); }
  emit<K extends keyof E>(e: K, payload: E[K]): void {
    (this.listeners[e] || []).forEach(h => h(payload));
  }
}
console.log("emit implemented");

Menerapkan Penghapusan

Metode off menghapus penangan yang sebelumnya didaftarkan dengan menyaringnya dari larik.

class TypedEmitter<E> {
  private listeners: { [K in keyof E]?: Array<(p: E[K]) => void> } = {};
  on<K extends keyof E>(e: K, h: (p: E[K]) => void) { (this.listeners[e] ||= []).push(h); }
  off<K extends keyof E>(e: K, h: (p: E[K]) => void) {
    this.listeners[e] = (this.listeners[e] || []).filter(x => x !== h);
  }
}
console.log("off implemented");

Menyatukan Kelas

Berikut adalah kelas lengkap dengan ketiga metodenya, yang bersifat generik untuk pemetaan peristiwa apa pun yang Anda berikan.

class TypedEmitter<E> {
  private listeners: { [K in keyof E]?: Array<(p: E[K]) => void> } = {};
  on<K extends keyof E>(e: K, h: (p: E[K]) => void) { (this.listeners[e] ||= []).push(h); }
  off<K extends keyof E>(e: K, h: (p: E[K]) => void) { this.listeners[e] = (this.listeners[e] || []).filter(x => x !== h); }
  emit<K extends keyof E>(e: K, p: E[K]) { (this.listeners[e] || []).forEach(h => h(p)); }
}
console.log("TypedEmitter complete");

Menggunakan TypedEmitter

Buat instans dengan pemetaan peristiwa konkret. Kini on dan emit sepenuhnya bertipe untuk peristiwa-peristiwa tersebut.

class TypedEmitter<E> {
  private listeners: { [K in keyof E]?: Array<(p: E[K]) => void> } = {};
  on<K extends keyof E>(e: K, h: (p: E[K]) => void) { (this.listeners[e] ||= []).push(h); }
  emit<K extends keyof E>(e: K, p: E[K]) { (this.listeners[e] || []).forEach(h => h(p)); }
}
interface Events { login: { userId: string } }
const bus = new TypedEmitter<Events>();
bus.on("login", p => console.log("hi", p.userId));
bus.emit("login", { userId: "u1" });

Kesalahan Tipe Terdeteksi

Kelas tersebut menolak peristiwa yang tidak dikenal dan muatan yang salah pada waktu kompilasi, sama seperti fungsi mandiri sebelumnya.

class TypedEmitter<E> {
  private listeners: { [K in keyof E]?: Array<(p: E[K]) => void> } = {};
  on<K extends keyof E>(e: K, h: (p: E[K]) => void) { (this.listeners[e] ||= []).push(h); }
  emit<K extends keyof E>(e: K, p: E[K]) { (this.listeners[e] || []).forEach(h => h(p)); }
}
interface Events { ping: { at: number } }
const bus = new TypedEmitter<Events>();
// bus.emit("pong", { at: 1 }); // Error
bus.emit("ping", { at: 1 });
console.log("typed bus");

Beberapa Penangan untuk Setiap Peristiwa

Karena setiap peristiwa dipetakan ke sebuah larik, Anda dapat mendaftarkan banyak penangan dan semuanya akan dijalankan saat emit.

class TypedEmitter<E> {
  private listeners: { [K in keyof E]?: Array<(p: E[K]) => void> } = {};
  on<K extends keyof E>(e: K, h: (p: E[K]) => void) { (this.listeners[e] ||= []).push(h); }
  emit<K extends keyof E>(e: K, p: E[K]) { (this.listeners[e] || []).forEach(h => h(p)); }
}
interface Events { tick: { n: number } }
const bus = new TypedEmitter<Events>();
bus.on("tick", p => console.log("a", p.n));
bus.on("tick", p => console.log("b", p.n));
bus.emit("tick", { n: 7 });

Dasar yang Dapat Anda Kembangkan

Kelas ini merupakan dasar yang kuat. Berikutnya kita akan menyempurnakan penyimpulan argumen pendengar dan menambahkan semantik once.

class TypedEmitter<E> {
  private listeners: { [K in keyof E]?: Array<(p: E[K]) => void> } = {};
  on<K extends keyof E>(e: K, h: (p: E[K]) => void) { (this.listeners[e] ||= []).push(h); }
  emit<K extends keyof E>(e: K, p: E[K]) { (this.listeners[e] || []).forEach(h => h(p)); }
}
const bus = new TypedEmitter<{ go: void }>();
bus.on("go", () => console.log("go!"));
bus.emit("go", undefined as void);

Pemeriksaan Singkat: Kelas Pemancar Generik

Uji pemahaman Anda tentang kelas pemancar peristiwa generik.

Ringkasan: Kelas Pemancar Peristiwa Generik

Anda membuat TypedEmitter<E> dengan penyimpanan listeners bertipe terpetakan serta metode on, off, dan emit yang sepenuhnya bertipe, sehingga menghasilkan pub/sub yang dapat digunakan kembali dan aman tipe untuk pemetaan peristiwa apa pun.

class TypedEmitter<E> {
  private listeners: { [K in keyof E]?: Array<(p: E[K]) => void> } = {};
  on<K extends keyof E>(e: K, h: (p: E[K]) => void) { (this.listeners[e] ||= []).push(h); }
  emit<K extends keyof E>(e: K, p: E[K]) { (this.listeners[e] || []).forEach(h => h(p)); }
}
const bus = new TypedEmitter<{ hi: { name: string } }>();
bus.on("hi", p => console.log(p.name));
bus.emit("hi", { name: "Ada" });

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Kelas Pemancar Peristiwa Generik” gratis?

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

Apa yang akan aku pelajari di “Kelas Pemancar Peristiwa Generik”?

Bangun pemancar peristiwa bertipe yang dapat digunakan kembali dari awal. Kamu berlatih TypeScript 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 TypeScript Academy?

Tidak diperlukan pengalaman sebelumnya. TypeScript 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 3 dari 4.

Berapa lama pelajaran “Kelas Pemancar Peristiwa Generik” 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 TypeScript Academy ini?

Ya. Setiap pelajaran TypeScript 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. Menentukan Jenis Peta Peristiwa
  2. emit dan on yang Aman Secara Jenis
  3. Kelas Pemancar Peristiwa Generik
  4. Menyimpulkan Argumen Pendengar
← Kembali ke TypeScript Academy