Saluran Error dan Dependensi
Lacak error bertipe dan dependensi yang disuntikkan dalam effect.
Saluran Error dan Dependensi adalah pelajaran TypeScript Academy gratis di CoddyKit. Ini adalah pelajaran 4 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.
Kanal Kesalahan dan Dependensi
Dua kanal membuat Effect menjadi kuat: kanal kesalahan bertipe (E) dan kanal persyaratan (R). Pelajaran ini menunjukkan cara gagal dengan kesalahan bertipe dan cara menyediakan dependensi melalui Context dan Layer.
Kegagalan Bertipe dengan Effect.fail
Effect.fail menempatkan sebuah nilai ke dalam kanal kesalahan. Kelas bertanda memudahkan pembedaan kesalahan.
import { Effect } from "effect";
class NotFound { readonly _tag = "NotFound"; }
class Forbidden { readonly _tag = "Forbidden"; }
const load = Effect.fail(new NotFound());
// Effect<never, NotFound, never>Kesalahan Bergabung Saat Disusun
Mengurutkan efek dengan kesalahan yang berbeda akan menggabungkan kesalahan tersebut dalam kanal E, sehingga tipe mencantumkan setiap kemungkinan kegagalan.
// Effect<A, NotFound, never> then Effect<B, Forbidden, never>
// => Effect<B, NotFound | Forbidden, never>Menangani Kesalahan
Effect.catchAll atau catchTag menangani kesalahan, menghapusnya dari kanal (atau menggantinya). Menangani NotFound mempersempit E.
import { Effect, pipe } from "effect";
const safe = pipe(
Effect.fail(new NotFound()),
Effect.catchTag("NotFound", () => Effect.succeed("default"))
);
// Effect<string, never, never> -- error handledMemulihkan vs Meneruskan
Jika Anda tidak menangani suatu kesalahan, kesalahan tersebut tetap berada di E dan diteruskan kepada pemanggil, yang kemudian harus menanganinya atau meneruskannya lagi. Kompiler memastikan kesalahan tidak pernah hilang begitu saja.
Mendeklarasikan Dependensi
Sebuah layanan dideklarasikan sebagai Context.Tag. Efek yang menggunakannya akan memperoleh layanan tersebut dalam kanal R.
import { Context, Effect } from "effect";
class Random extends Context.Tag("Random")<
Random,
{ readonly next: Effect.Effect<number> }
>() {}
const program = Effect.gen(function* () {
const random = yield* Random;
return yield* random.next;
});
// Effect<number, never, Random>Persyaratan Tampak dalam Tipe
Perhatikan bahwa kanal R sekarang berisi Random. Efek tersebut tidak dapat dijalankan sampai persyaratan itu terpenuhi; kompiler menegakkannya.
Menyediakan dengan Lapisan
Sebuah Layer menjelaskan cara membangun layanan. Menyediakan sebuah lapisan memenuhi persyaratan dan menghapusnya dari R.
import { Effect, Layer } from "effect";
const RandomLive = Layer.succeed(Random, {
next: Effect.sync(() => Math.random()),
});
const runnable = Effect.provide(program, RandomLive);
// Effect<number, never, never> -- R clearedMenyusun Lapisan
Lapisan dapat bergantung pada lapisan lain dan digabungkan untuk membangun graf dependensi lengkap. Effect merangkainya dalam urutan yang benar berdasarkan tipenya.
import { Layer } from "effect";
// Layer.merge(DatabaseLive, LoggerLive)
// Layer that provides both servicesMenguji dengan Menukar Lapisan
Karena dependensi dinyatakan secara eksplisit, pengujian dapat menyediakan lapisan yang berbeda (misalnya Random deterministik) tanpa menyentuh program yang sedang diuji, yang merupakan manfaat utama pelacakan persyaratan.
import { Layer, Effect } from "effect";
const RandomTest = Layer.succeed(Random, {
next: Effect.succeed(0.5),
});
// Effect.provide(program, RandomTest) -> deterministicMengapa Ini Penting
Kanal kesalahan dan persyaratan mengubah asumsi yang tidak terlihat menjadi kontrak yang diperiksa kompiler: setiap kegagalan harus ditangani atau dideklarasikan, dan setiap dependensi harus disediakan. Inilah yang membuat program Effect yang besar menjadi tangguh dan mudah diuji.
Pemeriksaan Singkat
Pastikan pemahaman Anda tentang kanal kesalahan dan dependensi.
Ringkasan
Kanal kesalahan melacak kegagalan bertipe (Effect.fail, yang dipersempit oleh catchTag/catchAll) yang bergabung saat Anda menyusun efek, sedangkan kanal persyaratan melacak layanan yang dideklarasikan melalui Context.Tag dan dipenuhi oleh Layer melalui Effect.provide. Keduanya membuat kegagalan dan dependensi diperiksa oleh kompiler serta memudahkan pengujian melalui penukaran lapisan.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Saluran Error dan Dependensi” gratis?
Ya — teks lengkap “Saluran Error dan Dependensi” 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 “Saluran Error dan Dependensi”?
Lacak error bertipe dan dependensi yang disuntikkan dalam effect. 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 4 dari 4.
Berapa lama pelajaran “Saluran Error dan Dependensi” 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
- Mengapa Sistem Effect Penting
- Jenis Effect
- Menyusun Effect
- Saluran Error dan Dependensi